2013-04-23 5 views
0

Не могли бы вы помочь мне использовать корреляцию ActionListener в моем коде? Код компилируется, и графический интерфейс отображается правильно, но кнопка не работает! Если вы хотите протестировать код, обратите внимание, что вам нужно поместить изображение в ту же папку, что и файл проекта, и изменить строку «ImageIcon myImageIcon = новый ImageIcon (« rodeo.jpg »); в соответствии с названием вашей фотографии.Реализация ActionListener в Java

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ImageApplication extends JFrame implements ActionListener 
{ 
public Image myImage; 
public JLabel myImageLabel; 
public ImageIcon myImageIcon; 
public JFrame frame; 
public JTextField txtWidth, txtHeight; 
public int origWidth, origHeight; 


public static void main(String[] args) 
{ 
    int origWidth, origHeight; 
    ImageApplication ia = new ImageApplication(); 
    ia.setVisible(true); 
    JFrame frame = new JFrame(); 
    ImageIcon myImageIcon = new ImageIcon("rodeo.jpg"); 
    JLabel myImageLabel = new JLabel(myImageIcon, JLabel.CENTER); 
    Image myImage = myImageIcon.getImage(); 


    origWidth = myImageIcon.getIconWidth(); 
    origHeight = myImageIcon.getIconHeight(); 

    JMenuBar myMenuBar = new JMenuBar(); 
    JMenu myMenu = new JMenu("Options"); 
    JMenuItem myMenuItem1 = new JMenuItem("Double"); 
    JMenuItem myMenuItem2 = new JMenuItem("Reset"); 
    myMenu.add(myMenuItem1); 
    myMenu.add(myMenuItem2); 
    myMenuBar.add(myMenu); 
    ia.setJMenuBar(myMenuBar); 

    JButton bAL = new JButton("Align Left"); 
    JButton bAC = new JButton("Align Center"); 
    JButton bAR = new JButton("Align Right"); 
    JButton bResize = new JButton ("Resize"); 
    bAL.setFocusPainted(false); 
    bAC.setFocusPainted(false); 
    bAR.setFocusPainted(false); 
    bResize.setFocusPainted(false); 

    JLabel lWidth = new JLabel("Width:"); 
    JLabel lHeight = new JLabel("Height:"); 
    JTextField txtWidth = new JTextField(Integer.toString(origWidth)); 
    JTextField txtHeight = new JTextField(Integer.toString(origHeight)); 

    JPanel GRID = new JPanel(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 

    c.fill = GridBagConstraints.BOTH; 
    c.weightx = 1f; 
    c.weighty = 0f; 

    c.gridx = 0; 
    c.gridy = 0; 
    GRID.add(bAL, c); 
    c.gridx++; 
    GRID.add(bAC, c); 
    c.gridx++; 
    GRID.add(bAR, c); 
    c.gridx = 0; 
    c.gridy = 1; 
    c.gridwidth = 3; 
    GRID.add(myImageLabel, c); 
    c.gridwidth = 1; 

    c.gridx = 0; 
    c.gridy = 2; 
    GRID.add(lWidth, c); 
    c.gridx++; 
    c.gridwidth = 2; 
    GRID.add(txtWidth, c); 
    c.gridwidth = 1; 

    c.gridx = 0; 
    c.gridy = 3; 
    GRID.add(lHeight, c); 
    c.gridx++; 
    c.gridwidth = 2; 
    GRID.add(txtHeight, c); 
    c.gridwidth = 1; 

    c.gridx = 0; 
    c.gridy = 4; 
    GRID.add(bResize, c); 

    ia.add(GRID, BorderLayout.CENTER); 
    ia.setSize(origWidth + 150, origHeight + 150); 

    myMenuItem1.addActionListener(ia); 
    myMenuItem1.setActionCommand("double"); 
    myMenuItem2.addActionListener(ia); 
    myMenuItem2.setActionCommand("reset"); 
    bAL.addActionListener(ia); 
    bAL.setActionCommand("left"); 
    bAC.addActionListener(ia); 
    bAC.setActionCommand("center"); 
    bAR.addActionListener(ia); 
    bAR.setActionCommand("right"); 
    bResize.addActionListener(ia); 
    bResize.setActionCommand("resize"); 
} 



private void ResizeImage(int Width, int Height) 
{ 
    myImage = myImage.getScaledInstance(Width, Height, Image.SCALE_SMOOTH); 
    myImageIcon.setImage(myImage); 
    myImageLabel.setIcon(myImageIcon); 

    txtWidth.setText(Integer.toString(Width)); 
    txtHeight.setText(Integer.toString(Height)); 

    setSize(Width + 150, Height + 150); 
} 

public void actionPerformed(ActionEvent e) 
{ 
    String command = e.getActionCommand(); 

    if(command == "left") myImageLabel.setHorizontalAlignment(JLabel.LEFT); 
    else if(command == "center") myImageLabel.setHorizontalAlignment(JLabel.CENTER); 
    else if(command == "right") myImageLabel.setHorizontalAlignment(JLabel.RIGHT); 
    else if(command == "resize") ResizeImage(Integer.parseInt(txtWidth.getText()),  
    Integer.parseInt(txtHeight.getText())); 
    else if(command == "double") ResizeImage(myImageIcon.getIconWidth() * 2, 
    myImageIcon.getIconHeight() * 2); 
    else if(command == "reset") ResizeImage(origWidth, origHeight); 
} 
} 

ответ

4

Использования String#equals для сравнения String содержания. Вы используете оператор ==, который сравнивает ссылки на объекты.

Однако, поскольку кнопки имеют разную функциональность, лучше для каждого иметь отдельного ActionListener. Это можно сделать с помощью анонимного экземпляра ActionListener.

Ошибка: переменная класса myImageLabel не назначается. Скорее другая переменная с таким же именем инициализируется в основном методе static. Вам нужно переместить все компоненты, созданные в основном методе, в метод экземпляра, а также удалить объявление локального класса JLabel.

Переехав код:

JLabel myImageLabel = new JLabel(myImageIcon, JLabel.CENTER); 

должен быть

myImageLabel = new JLabel(myImageIcon, JLabel.CENTER); 
+0

Спасибо за быстрый ответ, но это не решило проблему. При нажатии кнопки я получаю это "исключение в потоке "АВТ-EventQueue-0" java.lang.NullPointerException \t в ImageApplication.actionPerformed (ImageApplication.java:129) " – alex777

+0

проверка линии «myMenuItem1.addActionListener (Ia); " может быть проблема там? Я не мог использовать «это» в этой точке, поэтому я использовал объект приложения класса ... – alex777

+0

Вам нужно перенести все компоненты, созданные в методе 'main', в метод экземпляра и _also_ удалить локаль' JLabel' объявление класса. – Reimeus

2

Попробуйте этот метод: Что он делает: он добавляет к самой кнопки, при нажатии метод будет выполняться:

buttonName.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       //do what ever 
      } 
     }); 
     //set bunds for the button itself, if not done otherwise, but for your layout. 
+0

? Что такое 'setBounds'? Я не видел этого в коде OP? Учитывая тот факт, что они не знают о сравнении «String», я сомневаюсь, что это хорошая идея начать их показывать - IMHO – MadProgrammer

1

Данные экземпляры riables:

public JTextField txtWidth, txtHeight; 

не инициализированы, а упоминаются в вашем коде слушателя. У вас есть локальные переменные с тем же именем, которые вы создаете. Изменить это:

JTextField txtWidth = new JTextField(Integer.toString(origWidth)); 
JTextField txtHeight = new JTextField(Integer.toString(origHeight)); 

к этому:

txtWidth = new JTextField(Integer.toString(origWidth)); 
txtHeight = new JTextField(Integer.toString(origHeight)); 

и аналогично для других ваших переменных экземпляра.

0

Используйте следующий код, чтобы получить Изображение

ImageIcon myImageIcon = новый ImageIcon ("rodeo.jpg") GetImage().

Смежные вопросы