当它是一个具有相同actionlistener的JButton数组时,单击了哪个Jbutton

时间:2014-10-17 21:55:46

标签: java arrays jbutton actionlistener

我正在为tile puzzle

制作人工智能

我有一个Jbuttons数组,其文本设置为当前包含的数字。

我有命令

evt.getActionCommand();

将返回jbutton中的字符串,但我需要的是按下数组中的jbutton,所以我可以使用该值来对应我的Node类,它使用2d数组来跟踪节点值

新的代码归功于充满鳗鱼的气垫船

for (int i = 0; i < tileButtons.length; i++) {
        if (source == tileButtons[i]) {
            // the current i and j are your array row and column for the source button
            System.out.println("the " + i + " button");
        }
    }

2 个答案:

答案 0 :(得分:2)

您可以通过evt.getSource()获取实际按钮。这将返回按下的实际JButton对象。然后,如果您将按钮保存在数组中,则可以轻松地遍历数组直到找到与源匹配的按钮。

Object source = evt.getSource();
for (int i = 0; i < buttonArray.length; i++) {
   for (int j = 0; j < buttonArray[i].length; j++) { 
     if (source == buttonArray[i][j]) {
        // the current i and j are your array row and column for the source button
     }
   }
}

注意警告:ActionEvent#getSource()方法并不总是返回JButton,但是会再次返回导致ActionListener触发的内容,这可能是AbstractButton的任何子节点,JMenuItem,SwingTimer,也可能是其他

答案 1 :(得分:1)

从方法中调用参数“e”的getSource()。

public void actionPerformed(ActionEvent e);

您可以使用HashMap将每个按钮与某个自定义数据对象相关联。以下是这个想法的测试计划。

public class ButtonTest implements ActionListener{
    public static void main(String[] args){
        new ButtonTest();
    }
    HashMap<JButton, String> buttonToLocationMap;
    public ButtonTest(){
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout());
        frame.setVisible(true);
        frame.setSize(300, 300);
        buttonToLocationMap = new HashMap<>();

        JButton button1 = new JButton("Button1");
        button1.addActionListener(this);
        buttonToLocationMap.put(button1, "Replace the value type of this hashmap with any object associated with button1");
        frame.add(button1);


        JButton button2 = new JButton("Button2");
        button2.addActionListener(this);
        buttonToLocationMap.put(button2, "Replace the value type of this hashmap with any object associated with button2");
        frame.add(button2);     
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(buttonToLocationMap.get((JButton)e.getSource()));
    }
}