ActionListener: данные из двух класов

283
26 ноября 2016, 19:15

Новичок в SWING просит помощи

Есть два WindowsPanel. В разных классах, кнопки отдельно, поля для ввода отдельно.

public class WindowFrame extends JFrame {
    WindowFrame(){
        WindowPanel windowPanel = new WindowPanel();
        WindowPanel2 windowPanel2 = new WindowPanel2();
            this.setPreferredSize(new Dimension (400,600));
            this.add(windowPanel);
            this.add(windowPanel2);
            this.setFocusable(true);
            this.pack();
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);
            this.setTitle("Calculator");
            }
    }
public class WindowPanel extends JPanel {
    TextField textField1;
    TextField textField2;
    TextField textField3;
    WindowPanel(){
        this.setLayout(null);
        Label label1 = new Label();
        this.add(label1);
        label1.setText("First digit");
        label1.setBounds(50, 50, 200, 20);
        TextField textField1 = new TextField();
        textField1.setBounds(50, 70, 200, 30);
        this.add(textField1);
}

public class WindowPanel2 extends JPanel {
    WindowPanel2(){
        this.setLayout(new GridLayout(2, 2));
        ButtonListener1 bl1 = new ButtonListener1(this);
        Button button1 = new Button("+");
        this.add(button1);
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                float first = Float.parseFloat(WindowPanel.textField1.getText());
                float second = Float.parseFloat(WindowPanel.textField2.getText());
                float result = first + second;
                WindowPanel.textField1.setText("");
                WindowPanel.textField2.setText("");
                WindowPanel.textField3.setText(Float.toString(result));
            }
        });
}

При запуске выдает ошибку NPE, то есть не получает значение поля "textField".

В чем я не прав?

Answer 1

Честно говоря, я не понимаю, как этот код вообще скомпилировался, так как Вы пытаетесь обратиться к нестатическим полям класса WindowPanel через имя класса:

float first = Float.parseFloat(WindowPanel.textField1.getText());

Ошибка как минимум в том, что при обращении к элементам интерфейса Вы пытаетесь обратиться к полям класса WindowPanel, а не к полям созданного Вами объекта windowPanel класса WindowPanel.

UPD. И как подсказывают подсказывали в комментарии, в конструкторе WindowPanel() Вы не инициализируете поля класса: локальная переменная конструктора TextField textField1 скрывает одноименное поле класса, а остальные два поля Вы вообще не инициализируете.

READ ALSO
Параметры в методах

Параметры в методах

Помогите разобраться, пожалуйста

251
NavigationView различные itemTextColor

NavigationView различные itemTextColor

Имеется NavigationView в котором подключаю menu c items

307
Что не так с выводом массива? [дубликат]

Что не так с выводом массива? [дубликат]

На данный вопрос уже ответили:

305
Можно ли применять в Map двойной ключ?

Можно ли применять в Map двойной ключ?

Например, Map<String*, Integer> map = new TreeMap<String, Integer>();, там где * можно поставить < <String,String>, Integer > например?

319