Я впервые учусь работать с 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.
@ЭндрюТомпсон Привет! Это сработало, спасибо. Кроме того, я понимаю, что MyFrame — ужасное имя, я должен использовать более описательные имена даже во время практики. Другие советы будут чрезвычайно полезны, когда я лучше пойму основы Swing и Java, но, тем не менее, я ценю их. Кроме того, вот вопрос, на который я ссылался в своем посте.
У Oracle есть полезный учебник Создание графического интерфейса пользователя с помощью Swing. Пропустите раздел Изучение Swing с помощью среды IDE NetBeans. Обратите особое внимание на разделы Параллелизм в Swing и Размещение компонентов в контейнере.