При тестировании JButton мое лямбда-выражение работает, а actionPerformed — нет.

avatar
Beetle
8 января 2022 в 08:21
327
1
1

Я впервые учусь работать с Java Swing, следуя руководству на YouTube. Я добрался до раздела, посвященного кнопкам, и следовал коду до буквы T. Однако при попытке протестировать кнопку, чтобы она печатала слово «тест», когда я использую метод actionPerformed, моя кнопка не распечатайте слово.

Вы можете найти исходный код для этого теста здесь:

Main.java

package com.learnjava;
public class Main {

    public static void main(String[] args) {

        new MyFrame();

    }
}

MyFrame.java

package com.learnjava;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame implements ActionListener{
    
    JButton button;

    MyFrame() {

        JButton button = new JButton();
        button.setBounds(200, 100, 100, 50);
        button.addActionListener(this);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500, 500);
        this.setLayout(null);
        this.setVisible(true);
        this.add(button);


    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource() == button) {
            System.out.println("test");
        }
        
    }
}

Всякий раз, когда я нажимал кнопку, используя предыдущий код, он не печатал слово "тест". Если бы я использовал лямбда-выражение, это сработало бы.

MyFrame.java (обновлено лямбда-выражением)

package com.learnjava;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame implements ActionListener{
    
    JButton button;

    MyFrame() {

        JButton button = new JButton();
        button.setBounds(200, 100, 100, 50);
        button.addActionListener(e -> {System.out.println("test");}); // updated with lambda expression

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500, 500);
        this.setLayout(null);
        this.setVisible(true);
        this.add(button);


    }
}

Я пытался найти в Интернете причину, по которой прежний код не работает. Я видел один вопрос, но он остался без ответа. Хотя я мог бы согласиться на использование лямбда-выражения вместо этого, я все же хотел бы понять, как правильно написать прежний код, если я делаю что-то неправильно. Заранее спасибо!

Примечание. Если это важно по какой-то причине, я использую IDE IntelliJ, а мой JDK версии 12.

Источник
Beetle
8 января 2022 в 08:47
1

@ЭндрюТомпсон Привет! Это сработало, спасибо. Кроме того, я понимаю, что MyFrame — ужасное имя, я должен использовать более описательные имена даже во время практики. Другие советы будут чрезвычайно полезны, когда я лучше пойму основы Swing и Java, но, тем не менее, я ценю их. Кроме того, вот вопрос, на который я ссылался в своем посте.

Gilbert Le Blanc
8 января 2022 в 14:29
0

У Oracle есть полезный учебник Создание графического интерфейса пользователя с помощью Swing. Пропустите раздел Изучение Swing с помощью среды IDE NetBeans. Обратите особое внимание на разделы Параллелизм в Swing и Размещение компонентов в контейнере.

Ответы (1)

avatar
Andrew Thompson
8 января 2022 в 08:42
1

Изменить:

JButton button = new JButton(); 

Кому:

button = new JButton();

Первая — это локальная переменная, которая скрывает атрибут класса.

У 2-го класса та же проблема, но поскольку все это (создание кнопки, добавление прослушивателя, добавление в графический интерфейс) выполняется в одном разделе кода, не очевидно, что атрибут класса никогда не используется.