Java 如何在我没有调用的对象上调用方法';是否不为其指定引用名称?

Java 如何在我没有调用的对象上调用方法';是否不为其指定引用名称?,java,arrays,swing,jpanel,jbutton,Java,Arrays,Swing,Jpanel,Jbutton,例如,我试图对我在add方法的参数括号内构造的JButton调用setEnable方法: add(new JButton()); 我知道我可以这样做: JButton button = new JButton(); button.setEnable(false); 但是有没有办法在我没有指定引用名称的JButton上调用setEnable 我没有为JButton分配引用名称的原因是,我应该向JPanel添加未知数量的JButton。我是如何做到这一点的,就是使用这个for循环 for (in

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

add(new JButton());
我知道我可以这样做:

JButton button = new JButton();
button.setEnable(false);
但是有没有办法在我没有指定引用名称的
JButton
上调用
setEnable

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

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

我希望所有的JButtons都被禁用。

如果你把它添加到一个面板中,你可以得到该面板的组件,并通过这些组件循环,如果其中一个是按钮,你可以调用
setEnabled(
),但是如果有多个按钮,你必须确定它是否正确

编辑

既然您添加了希望禁用所有按钮,那么这个方法应该可以很好地工作。示例:

全部:

只是按钮:

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

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


但是,默认情况下,
JButton
是启用的,因此不需要显式地对其调用
setEnabled()
,它已经启用了

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

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

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

new JButton().setEnabled(true);
但是这将不允许您访问您在此处创建的
JButton
实例,因此您无法调用
add()

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

无论如何,在您的情况下,不要害怕使用引用:

final JButton button = new JButton();
button.setEnabled(true);
add(button);
请注意,在这种情况下,可以按任何顺序调用最后2个方法,结果将是相同的。

您在注释中声明:

我没有为JButton分配引用名称的原因是,我应该向JPanel添加未知数量的JButton。我如何做到这一点,是通过使用for循环:for(int I=0;I 然后只需使用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); 
} 
请注意,这是您在最初的问题中应该提前与我们共享的关键信息


编辑 你现在说:

我希望所有的按钮都被禁用

然后,只需从一开始就将其禁用:

for (int i = 0; i < numberOfButtonsToAdd; i++) { 
  JButton button = new JButton();
  button.setEnabled(false);
  buttonList.add(button);
  somePanel.add(button); 
}
for(inti=0;i
尽管我很好奇——为什么所有人都是残疾人?为什么没有ActionListener?没有短信


编辑2
你说:

我以后还能访问这些单独的按钮吗,因为它们都被分配了“按钮”

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


编辑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();
         }
      });
   }
}
导入java.awt.BorderLayout;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
公共类按钮列表扩展了JPanel{
私有静态最终整数行=6;
专用静态最终int COLS=6;
private List allButtons=new ArrayList();
private List=new ArrayList();
公共按钮列表(){
JPanel gridPanel=newjpanel(新网格布局(行、列));
对于(int i=0;ifor (int i = 0; i < numberOfButtonsToAdd; i++) { 
  JButton button = new JButton();
  button.setEnabled(false);
  buttonList.add(button);
  somePanel.add(button); 
}
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();
         }
      });
   }
}