java - 将多个按钮设置为禁用

标签 java swing

我正在尝试做到这一点,以便当用户单击按钮时它将被禁用。我使用以下代码来实现此目的:

            final JButton die1 = new JButton(theModel.letters.get(0));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn1){
                   die1.setEnabled(false);
               }
            });
            boggleGrid.add(die1);

theModel.letters.get(0) 是一个字符串值并且有效。我的问题是,当我尝试对同一 boggleGrid JPanel 中的其他按钮使用相同的代码时。我认为这可能与“最终”声明有关,但是 actionListener 必须发挥作用。这是我的其余代码:

JPanel boggleGrid = new JPanel(new GridLayout(4,4));

            theModel.randomLetters();
            final JButton die1 = new JButton(theModel.letters.get(0));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn1){
                   die1.setEnabled(false);
               }
            });
            boggleGrid.add(die1);

            final JButton die2 = new JButton(theModel.letters.get(1));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn2){
                   die2.setEnabled(false);
               }
            });
            boggleGrid.add(die2);

            final JButton die3 = new JButton(theModel.letters.get(2));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn3){
                   die3.setEnabled(false);
               }
            });
            boggleGrid.add(die3);

            final JButton die4 = new JButton(theModel.letters.get(3));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn4){
                   die4.setEnabled(false);
               }
            });
            boggleGrid.add(die4);

            final JButton die5 = new JButton(theModel.letters.get(4));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn5){
                   die5.setEnabled(false);
               }
            });
            boggleGrid.add(die5);

            final JButton die6 = new JButton(theModel.letters.get(5));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn6){
                   die6.setEnabled(false);
               }
            });
            boggleGrid.add(die6);

            final JButton die7 = new JButton(theModel.letters.get(6));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn7){
                   die7.setEnabled(false);
               }
            });
            boggleGrid.add(die7);

            final JButton die8 = new JButton(theModel.letters.get(7));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn8){
                   die8.setEnabled(false);
               }
            });
            boggleGrid.add(die8);

            final JButton die9 = new JButton(theModel.letters.get(8));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn9){
                   die9.setEnabled(false);
               }
            });
            boggleGrid.add(die9);

            final JButton die10 = new JButton(theModel.letters.get(9));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn10){
                   die10.setEnabled(false);
               }
            });
            boggleGrid.add(die10);

            final JButton die11 = new JButton(theModel.letters.get(10));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn11){
                   die11.setEnabled(false);
               }
            });
            boggleGrid.add(die11);

            final JButton die12 = new JButton(theModel.letters.get(11));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn12){
                   die12.setEnabled(false);
               }
            });
            boggleGrid.add(die12);

            final JButton die13 = new JButton(theModel.letters.get(12));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn13){
                   die13.setEnabled(false);
               }
            });
            boggleGrid.add(die13);

            final JButton die14 = new JButton(theModel.letters.get(13));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn14){
                   die14.setEnabled(false);
               }
            });
            boggleGrid.add(die14);

            JButton die15 = new JButton(theModel.letters.get(14));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn15){
                   die15.setEnabled(false);
               }
            });
            boggleGrid.add(die15);

            JButton die16 = new JButton(theModel.letters.get(15));
            die1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent btn16){
                   die16.setEnabled(false);
               }
            });
            boggleGrid.add(die16);

        frame.add(boggleGrid, BorderLayout.CENTER);

上下文:我正在制作一个 Boggle 游戏(如果有帮助的话)。谢谢

最佳答案

您在同一个 JButton 上多次调用 addActionListener,例如:

final JButton die4 = new JButton(theModel.letters.get(3));
die1.addActionListener(new ActionListener() {

您正在创建一个名为 die4 的按钮,然后向 die1 添加一个 ActionListener。在本例中,您希望在 die4 上调用 addActionListener

final JButton die4 = new JButton(theModel.letters.get(3));
die4.addActionListener(new ActionListener() {
^^^^

这是您的代码的实现,它更简洁,并且可能更易于维护:

JPanel boggleGrid = new JPanel(new GridLayout(4, 4));

ActionListener disableButtonListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event)
    {
        // event.getSource() will return a reference to the control that
        // fired the event. In this case, a JButton. We protect
        // ourselves from a ClassCastException just in case though.
        if (!(event.getSource() instanceof JButton)) {
            return;
        }

        ((JButton) event.getSource()).setEnabled(false);
    }
};

theModel.randomLetters();

for (int i = 0; i < 16; i++) {
    JButton button = new JButton(theModel.letters.get(i));
    button.addActionListener(disableButtonListener);
    boggleGrid.add(button);
}

frame.add(boggleGrid, BorderLayout.CENTER);

关于java - 将多个按钮设置为禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32214944/

相关文章:

java - 如何暂停程序直到按下按钮?

java - 如何验证 jtextfield 的特定格式?

java - Swing VerticalBox 元素大小

java - getGraphics() 返回空值

java - 如何仅在java中获取特定标签的Jsoup消息?

java - Java 包的 Maven 依赖关系

java - Log4j 不写入文件

java - 如何在应用程序中将粤语设置为语音搜索语言?

JAVA:将字符串调节为组合框项目,可能吗?

java - MouseListener 什么都不做