测试 JButton 时,我的 lambda 表达式有效,但 actionPerformed 无效
When testing JButton my lambda expression works, but actionPerformed does not
我是通过关注 YouTube 上的 tutorial 来学习如何使用 Java Swing 的。我已经到达了包含按钮的部分,并且一直在跟踪 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");
}
}
}
每当我使用之前的代码按下按钮时,它都不会打印出“test”这个词。如果我使用 lambda 表达式,它会起作用。
MyFrame.java(用 lambda 表达式更新)
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);
}
}
我一直在网上寻找为什么以前的代码不起作用的原因。我看过一个 question,但没有得到答复。虽然我可以改用 lambda 表达式,但我仍然想了解如果我做错了什么,如何正确编写以前的代码。先谢谢你了!
注意:如果由于某种原因相关,我使用的 IDE 是 IntelliJ 而我的 JDK 是版本 12.
变化:
JButton button = new JButton();
收件人:
button = new JButton();
第一个是隐藏 class 属性的局部变量。
第二个class有同样的问题,但由于它(创建按钮、添加监听器、将其添加到GUI)都是在一个代码部分完成的,所以class 属性从未使用过。
我是通过关注 YouTube 上的 tutorial 来学习如何使用 Java Swing 的。我已经到达了包含按钮的部分,并且一直在跟踪 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");
}
}
}
每当我使用之前的代码按下按钮时,它都不会打印出“test”这个词。如果我使用 lambda 表达式,它会起作用。
MyFrame.java(用 lambda 表达式更新)
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);
}
}
我一直在网上寻找为什么以前的代码不起作用的原因。我看过一个 question,但没有得到答复。虽然我可以改用 lambda 表达式,但我仍然想了解如果我做错了什么,如何正确编写以前的代码。先谢谢你了!
注意:如果由于某种原因相关,我使用的 IDE 是 IntelliJ 而我的 JDK 是版本 12.
变化:
JButton button = new JButton();
收件人:
button = new JButton();
第一个是隐藏 class 属性的局部变量。
第二个class有同样的问题,但由于它(创建按钮、添加监听器、将其添加到GUI)都是在一个代码部分完成的,所以class 属性从未使用过。