此代码也在编译和执行,但方法actionPerformed()
未正确执行。我的意思是在点击OK按钮后,JTextField
中没有任何内容。使用e.getSource()
后即不执行任何操作。 System.out.println("I am done ")
工作正常,但t.setText("Hey there")
无效。代码有什么问题?如果有人可以,请帮帮我
你也可以详细说明为什么如果不在JButton
上添加JTextField
和Panel
,它就不可见了?为什么添加面板以使按钮和文本字段可见是很重要的。没有它是不明显的原因?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class A implements ActionListener {
JFrame f;
JButton b;
JPanel p;
JLabel l;
JTextField t;
A(String s) {
JFrame f=new JFrame(s);
f.setVisible(true);
f.setSize(400,400);
JButton b= new JButton("OK");
JTextField t=new JTextField();
JPanel p=new JPanel();
f.add(p);
p.setBounds(0,0,300,300);
p.add(b);
b.setBounds(30,40,80,80);
p.add(t);
t.setBounds(100,200,80,80);
b.addActionListener(this);
t.addActionListener(this);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == b) {
t.setText("Hey There");
}
System.out.println("I m done!!");
}
public static void main(String[] args) {
System.out.println("Hey there");
new A("First App");
}
}
答案 0 :(得分:3)
您通过在构造函数中重新声明b
变量来隐藏b
变量,这意味着类中的class A {
JButton b; // this guy stays null!
public A() {
JButton b = new JButton(...);
}
字段与GUI中显示的字段不同。不要这样做,你的问题就解决了。
即你正在这样做:
class A {
JButton b;
public A() {
b = new JButton(...); //note the difference?
}
解决方案是这样做:
setBounds(...)
你问:
为什么添加面板以使按钮和文本字段在摇摆中可见是很重要的?
这是布局管理员的问题。默认情况下,JPanel使用FlowLayout,允许您添加组件,例如从左上角填写书架中的书籍。另一方面,JFrame的contentPane使用BorderLayout,如果您默认添加内容,则只显示最后添加的内容并填充GUI。请注意,您正在尝试@Entity
public class User{
private String name;
private String login;
private String password;
@OneToMany
private List<Role> roles;
}
,而您不应该这样做。让布局经理做那件事。
答案 1 :(得分:3)
您正在隐藏构造函数中的所有字段。
删除重新声明,它将按预期工作。
这样的事情:
A(String s) {
f = new JFrame(s);
f.setVisible(true);
f.setSize(400, 400);
b = new JButton("OK");
t = new JTextField();
p = new JPanel();
f.add(p);
p.setBounds(0, 0, 300, 300);
p.add(b);
b.setBounds(30, 40, 80, 80);
p.add(t);
t.setBounds(100, 200, 80, 80);
b.addActionListener(this);
t.addActionListener(this);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
请注意,我们不会重新声明任何这些变量。这就是你的活动没有解雇的原因;声明的字段仍为null
。
答案 2 :(得分:3)
而不是做你正在做的事情,为什么不使用匿名的内部类?
类似的东西:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
class A {
JFrame f;
JButton b;
JPanel p;
JLabel l;
JTextField t;
A(String s) {
f = new JFrame(s);
f.setVisible(true);
f.setSize(400, 400);
p = new JPanel();
p.setBounds(0, 0, 300, 300);
t = new JTextField();
t.setBounds(100, 200, 80, 80);
p.add(t);
b = new JButton("OK");
b.setBounds(30, 40, 80, 80);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
t.setText("Hello! World.");
}
});
p.add(b);
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
System.out.println("Hey there");
new A("First App");
}
}
我没有执行此代码,但我相信这会有用,这种方法可以帮助您更好地组织代码。 这就是我通常编码的方式。
如果您使用的是Java 8,则最好使用lambda表达式,因为ActionListener
是单个抽象方法接口。
如果你想查看使用情况,那就是这样:
b.addActionListener(e -> t.setText("Hello! World."));
为了更好地理解,您可以查看此视频。它适用于JavaFX,但匿名内部类和lambda表达式的概念保持不变。