我正在尝试动态添加按钮(JButtons),每次都会更改名称。我用for循环做它并没有真正的问题。但是当添加一个动作监听器或识别哪个按钮被按下时,那就是当事情不能很好地工作时。
MyFrame.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.GridLayout;
public class MyFrame extends JFrame implements ActionListener
{
private JPanel panel;
private static JButton[] buttons = new JButton[18];
// set all static calculate JButtons
private static JButton equalsBtn, addBtn, subBtn, multiBtn, divBtn, clearBtn, plusMinusBtn, decimalBtn;
// set all static number JBtuttons
private static JButton zeroBtn, oneBtn, twoBtn, threeBtn, fourBtn, fiveBtn, sixBtn, sevenBtn, eightBtn, nineBtn;
private static JTextField resultField;
// numOne is the first row of figures en the second numSecond is the second row
private static double numOne, numSecond, result;
private static double plusMinus;
private static int addClick = 0, subClick = 0, multiClick = 0, divClick = 0;
private static int clearField;
public MyFrame() {
// configure the JFrame
super("Rekennen maar!");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setSize(230, 370);
setLocationRelativeTo(null);
// confugure the JPanel
panel = new JPanel();
panel.setSize(230, 370);
panel.setLayout(new GridLayout(5, 0));
// array string whit all the button names
String a_btnNames[] = {"clearBtn", "plusMinusBtn", "divBtn", "multiBtn", "sevenBtn", "eightBtn", "nineBtn", "subBtn", "fourBtn", "fiveBtn", "sixBtn", "addBtn", "oneBtn", "twoBtn", "threeBtn", "equalsBtn", "zeroBtn", "decimalBtn"};
// array String whit all button characters
String a_btnCharts[] = {"C", "+/-", "/", "*", "7", "8", "9", "-", "4", "5", "6", "+", "1", "2", "3", "=", "0", "."};
for(int i = 0; i < buttons.length; i++)
{
// make new button name
buttons[i] = new JButton(a_btnNames[i]);
// add button to panel
panel.add(new JButton(a_btnCharts[i]));
//System.out.println(buttons[i]);
}
// add panel when he's filled
add(panel);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// press the button
if ( e.getSource() == ...... ) {
System.out.println("123");
}
}
}
Main.java
public class Main {
public static void main(String[] arg) {
MyFrame mf = new MyFrame();
}
}
答案 0 :(得分:5)
改变循环,就像这样。
for(int i = 0; i < buttons.length; i++)
{
// make new button name
JButton btn = new JButton("" + a_btnNames[i]);
buttons[i] = btn;
btn.addActionListener(this);
// add button to panel
panel.add(btn);
//System.out.println(buttons[i]);
}
然后像这样有一个actionPerformed()。
public void actionPerformed(ActionEvent evt) {
Object src = evt.getSource();
if (src == buttons[0]) {
//First button actions
} else if (src == buttons[1]) {
//Second button actions
}
}
应该工作。
答案 1 :(得分:4)
按下按钮时没有任何内容。创建每个按钮时,必须为它们提供动作侦听器。
此外,您应该添加您创建的相同按钮。
buttons[i] = new JButton("" + a_btnNames[i]);
//buttons[i] should now be added to the panel
新的for循环应该是......
for(int i = 0; i < buttons.length; i++){
buttons[i] = new JButton("" + a_btnNames[i]); //create button & add to array
buttons[i].addActionListener(this); //add an action listener to the current button
panel.add(buttons[i]); //add that same button to the panel
}
答案 2 :(得分:0)
当您知道evt.getSource()
返回ActionEvent
的源组件时,我没有发现任何问题。
要将动作侦听器注册到JButton
之类的组件,我们通常会这样做:
jButton.addActionListener(anActionListener);
对于您的上下文,您可以使用ActionListener
的帮助传递this
。
不要将ActionListener
接口实现到某些不听此类事件或拥有它们的类。如果需要,通过实现它来声明一个新类,并使用该类的实例来注册监听器。
class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e) {
// press the button
}
}
MyActionListener actionListener = new MyActionListener();
jButton1.addActionListener(actionListener);
jButton2.addActionListener(actionListener);
jButton3.addActionListener(actionListener);
我正在尝试动态添加更改名称的按钮(JButtons) 每次。
但您可能对使用new JButton("some text")
设置名称存在误解。
这不会设置Button的名称,而是设置文本内容。您需要改为使用button.setName("aName")
。
但是,您始终可以使用getName
或getText
方法来识别您的特定按钮。
public void actionPerformed(ActionEvent e) {
// press the button
JButton button = (JButton)e.getSource();
Syestem.out.println(button.getName()); // get the name
System.out.println(button.getText()) // get the text content
if(button.getText().equals("clearBtn"))
// clear things for me
}
答案 3 :(得分:0)
几乎没有变化
for(int i = 0; i < buttons.length; i++)
{
// make new button name
buttons[i] = new JButton(a_btnCharts[i]);
buttons[i].setName(a_btnNames[i]); // assign button name
buttons[i].addActionListener(this); // assign action listener
// add button to panel
panel.add(buttons[i]);
}
和
@Override
public void actionPerformed(ActionEvent e) {
// press the button
System.out.println(e.getActionCommand());
JButton btn=(JButton)e.getSource();
System.out.println(btn.getName()); // use name or action command in if statment
}
您的主要方法应该是
public static void main(String[] arg) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
MyFrame mf = new MyFrame();
}
});
}
答案 4 :(得分:0)
请记住首先将ActionListener添加到JButtons。然后,使用getSource()这种方式对您的情况没有帮助,因为您没有保留对要添加到面板的JButtons的引用。您可以使用getActionCommand() - 默认行为是它返回按钮的标签,但您可以使用setActionCommand(...)覆盖它:
if ( e.getActionCommand().equals(a_btnCharts[0] ) {
答案 5 :(得分:0)
遍历JButton数组:
for (int i = 0; i < buttons.length; ++i) {
if (e.getSource()==buttons[i]){
System.out.println("Button name: " + a_btnNames[i] +"<> Char:"+ a_btnCharts[i] + " pressed");
}
}