如何调用我没有为其分配引用名称的对象上的方法?

时间:2013-11-25 16:51:31

标签: java arrays swing jpanel jbutton

例如,我试图在setEnable上调用我在add方法的参数括号内构建的JButton方法:

add(new JButton());

我知道我可以做类似的事情:

JButton button = new JButton();
button.setEnable(false);

但我是否可以在setEnable上拨打JButton我没有为其分配参考名称?

我没有为JButton分配引用名称的原因是因为我应该向JPanel添加未知数量的JButton。我是如何做到这一点的,就是使用这个for循环。

for (int i = 0; i < numberOfButtonsToAdd; i++) 
{
   JPanelName.add(new JButton());
}

我希望禁用所有JButton。

5 个答案:

答案 0 :(得分:3)

如果您将其添加到面板,您可以获取该面板的组件并循环浏览这些组件(如果有一个按钮,您可以调用setEnabled(),但是如果有多个按钮则需要确定它是否是正确的。

修改

由于您添加了您希望禁用所有按钮,因此此方法应该可以很好地工作。例子:

所有

        for(Component  c : panel.getComponents()){
            c.setEnabled(false);
        }

Just JButtons:

        for(Component  c : panel.getComponents()){
            if(c instanceof JButton){
                ((JButton)c).setEnabled(false);
            }
        }

答案 1 :(得分:3)

您在评论中说明:

  

我没有为JButton分配引用名称的原因是因为我应该向JPanel添加未知数量的JButton。我是怎么做的,是通过使用for循环:for(int i = 0; i&lt; numberOfButtonsToAdd; i ++){JPanelName.add(new JButton()); }

然后只使用JButton的数组或ArrayList。

// in your field declarations
List<JButton> buttonList = new ArrayList<JButton>();

// elsewhere in your program
for (int i = 0; i < numberOfButtonsToAdd; i++) { 
  JButton button = new JButton();
  buttonList.add(button);
  somePanel.add(button); 
} 

现在,您可以通过buttonList.get(someIndex)

引用列表中的任何按钮

另请注意,大多数按钮都是ActionListeners,只要按下按钮就会激活这些按钮。没有这样的听众,按钮几乎没用。您还可以通过传递给actionPerformed方法的ActionEvent对象从ActionListener获取对按下的JButton的引用:

public void actionPerformed(ActionEvent e) {
   AbstractButton myButton = (AbstractButton) e.getSource();
   // now you can use myButton
}

请注意,这是您应该在原始问题中预先与我们分享的关键信息。


修改 你现在说:

  

我希望禁用所有JButton。

然后让他们从一开始就禁用它们:

for (int i = 0; i < numberOfButtonsToAdd; i++) { 
  JButton button = new JButton();
  button.setEnabled(false);
  buttonList.add(button);
  somePanel.add(button); 
}

虽然我很好奇 - 为什么所有残疾人?为什么没有ActionListener?没有文字?


编辑2
你说:

  

我以后是否仍然可以访问这些单独的按钮,因为它们都被分配了“按钮”?

请理解变量名称并不重要,事实上,在上面的示例中,名为button的变量不存在于声明它的for循环之外。相反,重要的是JButton对象的 引用 。正如你在其他答案中所讨论的那样,并且你知道,这可以通过使用一个变量来获得,但它不一定是JButton的直接变量,它可以,就像在这种情况下一样,是变量为ArrayList<JButton>。这就是为什么我建议你创建这个实体。


编辑3
例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class ButtonLists extends JPanel {
   private static final int ROWS = 6;
   private static final int COLS = 6;
   private List<JButton> allButtons = new ArrayList<JButton>();
   private List<JButton> evenButtons = new ArrayList<JButton>();

   public ButtonLists() {
      JPanel gridPanel = new JPanel(new GridLayout(ROWS, COLS));
      for (int i = 0; i < ROWS; i++) {
         for (int j = 0; j < COLS; j++) {
            int buttonInt = i * COLS + j;
            String buttonString = String.valueOf(buttonInt);
            JButton button = new JButton(buttonString);
            button.setEnabled(false);
            gridPanel.add(button);
            allButtons.add(button);
            if (buttonInt % 2 == 0) {
               evenButtons.add(button);
            }
         }
      }

      JPanel bottomPanel = new JPanel();
      bottomPanel.add(new JButton(new AbstractAction("Activate All") {

         @Override
         public void actionPerformed(ActionEvent e) {
            for (JButton btn : allButtons) {
               btn.setEnabled(true);
            }
         }
      }));
      bottomPanel.add(new JButton(new AbstractAction("Activate Even") {

         @Override
         public void actionPerformed(ActionEvent e) {
            for (JButton btn : allButtons) {
               btn.setEnabled(false);
            }
            for (JButton btn : evenButtons) {
               btn.setEnabled(true);
            }
         }
      }));
      bottomPanel.add(new JButton(new AbstractAction("Activate Odd") {

         @Override
         public void actionPerformed(ActionEvent e) {
            for (JButton btn : allButtons) {
               btn.setEnabled(true);
            }
            for (JButton btn : evenButtons) {
               btn.setEnabled(false);
            }
         }
      }));

      setLayout(new BorderLayout());
      add(gridPanel, BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.PAGE_END);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("ButtonLists");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new ButtonLists());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

答案 2 :(得分:1)

不,你不能。如果setEnabled()返回了它启用的对象,则可以在一行中启用并添加对象。但事实上,setEnabled()会返回void,因此您别无选择,只能使用局部变量。

但是,默认情况下会启用JButton,因此无需在其上显式调用setEnabled(),它已经启用!

答案 3 :(得分:0)

唯一可行的方法是,如果您要将其添加到get方法中。除此之外,你没有任何其他选择。最好的方式是你展示的。

JButton button = new JButton();
button.setEnable(true);

答案 4 :(得分:0)

您可以在新实例中调用方法,例如

new JButton().setEnabled(true);

但是这不允许您访问此处创建的JButton实例,因此您无法拨打add()

只有在方法调用返回调用它的实例对象时,才能执行此操作。因此,如果例如setEnabled将返回调用它的同一实例(即this上下文中的setEnabled),则可以执行add(new JButton().setEnabled(true))

无论如何你不要害怕使用引用:

final JButton button = new JButton();
button.setEnabled(true);
add(button);

请注意,在这种情况下,可以按任何顺序调用最后两个方法,结果将是相同的。