如何在按下时获取按钮的变量名称?

时间:2014-08-27 11:46:49

标签: java swing jbutton actionlistener

我在获取按钮的ID /变量名时遇到问题。一般来说,我想创造出游戏灯。我创建了按钮面板(NxN,N来自组合框),但我不知道如何在按下后获得单个按钮的ID。有什么想法吗?

    private void p1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    String temp = jComboBox1.getSelectedItem().toString();
    ile=Integer.parseInt(temp);

    jPanel1.removeAll();
    jPanel1.setLayout(new GridLayout(ile,ile));
    for (int i = 0; i < ile; i++) {
        for (int j = 0; j < ile; j++) {  
            JButton btn = new JButton();
            btn.setPreferredSize(new Dimension(40, 40));
            btn.setBackground(Color.green);
            btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {          
        /*What put here?*/
            }
            });
            jPanel1.add(btn);  
            revalidate();
            pack();
        }
    }
}  

3 个答案:

答案 0 :(得分:7)

您可以获得对通过ActionEvent的getSource()方法推送的按钮的引用。

如,

public void actionPerformed(ActionEvent e)  {          
   JButton selectedButton = (JButton) e.getSource();
}

现在,如果您需要知道按钮在网格中的位置,则需要做更多工作,例如将按钮放入数组或ArrayList中,然后遍历数组查找所选的索引号按钮。

如,

// changes to code marked with a //!! comment
private void p1ActionPerformed(java.awt.event.ActionEvent evt) {
  String temp = jComboBox1.getSelectedItem().toString();
  ile = Integer.parseInt(temp);

  jPanel1.removeAll();
  jPanel1.setLayout(new GridLayout(ile, ile));

  final JButton[][] buttons = new JButton[ile][ile]; //!!

  for (int i = 0; i < ile; i++) {
     for (int j = 0; j < ile; j++) {
        JButton btn = new JButton();
        btn.setPreferredSize(new Dimension(40, 40));
        btn.setBackground(Color.green);
        btn.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
              //!!
              JButton source = (JButton) e.getSource();
              for (int k = 0; k < buttons.length; k++) {
                 for (int l = 0; l < buttons[k].length; l++) {
                    if (buttons[k][l] == source) {
                       System.out.printf("row: %d, col: %d%n", l, k);
                       return;
                    }
                 }
              }
           }
        });
        jPanel1.add(btn);
        buttons[i][j] = btn; //!!
        //!! revalidate();
        //!! pack();
     }
  }
  jPanel1.revalidate(); //!!
  jPanel1.repaint(); //!!
}

作为旁注,每当我看到removeAll()时,我认为通过使用CardLayout可能会更好地实现这一目标


作为第二个侧面说明,当我在问题中看到“获取变量名称”时,我总是畏缩。变量“名称”实际上并不是那么重要,不存在许多对象,并且几乎在编译代码中不存在。如果一个对象被多个变量引用,哪一个代表该对象的“名称”?更重要的是对象引用 ,这是您的问题的大部分答案都在处理。

答案 1 :(得分:2)

Hovercraft Full Of Eels的建议很好。或者,在您的情况下,您可以使用代码中定义的按钮,但您应该将其设为最终。

for (int i = 0; i < ile; i++) {
    for (int j = 0; j < ile; j++) {  
        final JButton btn = new JButton();
        btn.setPreferredSize(new Dimension(40, 40));
        btn.setBackground(Color.green);
        btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {          
           // here we can use the variable btn - java will create an access method automatically
           System.out.println(btn.getText());
        }
        });
        jPanel1.add(btn);  
        revalidate();
        pack();
    }
}

答案 2 :(得分:2)

你有很多选择(如你所见)。

您也可以使用set/getName和/或set/getActionCommand,甚至set/getText,但我个人不会依赖此...

for (int i = 0; i < ile; i++) {
    for (int j = 0; j < ile; j++) {  
        JButton btn = new JButton();
        btn.setBackground(Color.green);
        String id = Integer.toString(i) + "x" + Integer.toString(j);
        btn.setName(id);
        // and/or
        btn.setActionCommand(id);
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {          
                JButton btn = (JButton)e.getSource();
                String id = btn.getName();
                // and/or
                String id = btn.getActionCommand();
            }
        });
        jPanel1.add(btn);  
    }
}
pack();