例如,我试图在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。
答案 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);
请注意,在这种情况下,可以按任何顺序调用最后两个方法,结果将是相同的。