如何打印触发事件的按钮名称?
How can i print the button name that trigger the event?
我制作了这个程序,当我点击某个按钮时,我想打印一条消息和按钮的名称。但它不打印任何东西,也不会出错。
public class Example {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Hello");
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(new BorderLayout());
JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new GridLayout(2, 2));
JTextArea txtArea = new JTextArea();
HelloActionListener listen = new HelloActionListener(txtArea);
JButton b1 = new JButton("TOP");
b1.addActionListener(listen);
JButton b2 = new JButton("LEFT");
JButton b3 = new JButton("RIGHT");
JButton b4 = new JButton("BOTTOM");
b4.addActionListener(listen);
}
}
和 class HelloActionListener
:
public class HelloActionListener implements ActionListener {
public JTextArea area;
public HelloActionListener(JTextArea area) {
this.area = area;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton x = (JButton) e.getSource();
area.setText("Hello Folks" + x.getText());
}
}
有谁知道我的错误在哪里?
我看到三个主要问题。第一个是您没有将 Button
添加到您创建的 Jpanel
(buttonsPanel
),也没有将 buttonsPanel
添加到您的 frame
,并且您也没有将 txtArea
添加到 frame
。其次,您的操作顺序已关闭。我建议您在构建完框架后调用 frame.setVisible(true)
。第三个问题是您在 JFrame
上使用 BorderLayout
,这不是一个很好的布局(在我看来)。你的听众和其他代码看起来都很好。
将您的代码更改为此似乎可以使它 运行 符合要求:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Hello");
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2,1));
JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new GridLayout(2, 2));
JTextArea txtArea = new JTextArea("Place Holder");
txtArea.setColumns(2);
HelloActionListener listen = new HelloActionListener(txtArea);
JButton b1 = new JButton("TOP");
b1.addActionListener(listen);
buttonsPanel.add(b1);
JButton b2 = new JButton("LEFT");
buttonsPanel.add(b2);
JButton b3 = new JButton("RIGHT");
buttonsPanel.add(b3);
JButton b4 = new JButton("BOTTOM");
b4.addActionListener(listen);
buttonsPanel.add(b4);
frame.add(txtArea);
frame.add(buttonsPanel);
frame.setVisible(true);
}
不过,我建议阅读 this guide Java 中有关布局管理器的内容。尽管它在这里有效,但这并不是布局的好方法。
您忘记将 txtArea
添加到您的框架中。
我制作了这个程序,当我点击某个按钮时,我想打印一条消息和按钮的名称。但它不打印任何东西,也不会出错。
public class Example {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Hello");
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(new BorderLayout());
JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new GridLayout(2, 2));
JTextArea txtArea = new JTextArea();
HelloActionListener listen = new HelloActionListener(txtArea);
JButton b1 = new JButton("TOP");
b1.addActionListener(listen);
JButton b2 = new JButton("LEFT");
JButton b3 = new JButton("RIGHT");
JButton b4 = new JButton("BOTTOM");
b4.addActionListener(listen);
}
}
和 class HelloActionListener
:
public class HelloActionListener implements ActionListener {
public JTextArea area;
public HelloActionListener(JTextArea area) {
this.area = area;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton x = (JButton) e.getSource();
area.setText("Hello Folks" + x.getText());
}
}
有谁知道我的错误在哪里?
我看到三个主要问题。第一个是您没有将 Button
添加到您创建的 Jpanel
(buttonsPanel
),也没有将 buttonsPanel
添加到您的 frame
,并且您也没有将 txtArea
添加到 frame
。其次,您的操作顺序已关闭。我建议您在构建完框架后调用 frame.setVisible(true)
。第三个问题是您在 JFrame
上使用 BorderLayout
,这不是一个很好的布局(在我看来)。你的听众和其他代码看起来都很好。
将您的代码更改为此似乎可以使它 运行 符合要求:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Hello");
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2,1));
JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new GridLayout(2, 2));
JTextArea txtArea = new JTextArea("Place Holder");
txtArea.setColumns(2);
HelloActionListener listen = new HelloActionListener(txtArea);
JButton b1 = new JButton("TOP");
b1.addActionListener(listen);
buttonsPanel.add(b1);
JButton b2 = new JButton("LEFT");
buttonsPanel.add(b2);
JButton b3 = new JButton("RIGHT");
buttonsPanel.add(b3);
JButton b4 = new JButton("BOTTOM");
b4.addActionListener(listen);
buttonsPanel.add(b4);
frame.add(txtArea);
frame.add(buttonsPanel);
frame.setVisible(true);
}
不过,我建议阅读 this guide Java 中有关布局管理器的内容。尽管它在这里有效,但这并不是布局的好方法。
您忘记将 txtArea
添加到您的框架中。