如果同时满足 9 个 Jbuttons 的条件?

If condition for 9 Jbuttons simultaneously?

if condition working for only one button at a time我已经将 9 个 Jbuttons 编程为 return 8 种颜色中的一种,在单击鼠标时随机选择。我添加了一个 return 结果的 Jlabel - 我希望结果 return 成为“赢家!”如果所有 Jbutton 的颜色都相同,则为字符串。

这是完整的代码!

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import static java.awt.Color.*;

public class buttonTest {

    public static void main(String[] args) {

        new buttonTest();
    }

    public buttonTest() { //CONSTRUCTOR.
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Colour Button 4.0"); 
                frame.add(new colourButton()); 
                frame.pack(); 
                frame.setLocationRelativeTo(null); 
                frame.setVisible(true);
            }
        });
    }

    public class colourButton extends JPanel implements ActionListener { 
        Random rand = new Random(); 
        JButton buttons[]; // created a button array.
        JLabel gameRules = new JLabel("Match the colour buttons."); 
        JLabel timer = new JLabel("00:00 (placeholder)");
        JLabel result = new JLabel("Result: (placeholder)");
        byte value = 0;

        public colourButton() {

            add(gameRules); 
            buttons = new JButton[9];
            setLayout(new GridLayout(3, 3));
            for (int i = 0; i < buttons.length; i++) { 
                buttons[i] = new JButton("colour button"); 
                buttons[i].setBorderPainted(false); 
                buttons[i].setContentAreaFilled(false); 
                buttons[i].setOpaque(true);
                buttons[i].addActionListener(this); 
                add(buttons[i]);
                add(timer);
                add(result);
                setVisible(true); 
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            if (!(e.getSource() instanceof JButton)) { 
                return;
            }

            String clickedbutton = e.getActionCommand();
            System.out.println(clickedbutton + " button clicked.");
           
            JButton button = (JButton) e.getSource(); 

            value++; 
            value %= 9; 
            switch (rand.nextInt(9)) { 
                case 0:
                    button.setBackground(null); 
                case 1:
                    button.setBackground(red);
                    break;
                case 2:
                    button.setBackground(orange);
                    break;
                case 3:
                    button.setBackground(yellow);
                    break;
                case 4:
                    button.setBackground(green);
                    break;
                case 5:
                    button.setBackground(cyan);
                    break;
                case 6:
                    button.setBackground(blue);
                    break;
                case 7:
                    button.setBackground(MAGENTA);
                    break;
                case 8:
                    button.setBackground(pink);
                    break;
            }
            if (button.getBackground() == magenta) {
                result.setText("magenta");
            } else {
                result.setText("placeholder result");
            }
        }
    }
}

我想它在逻辑上是这样的:

如果按钮数是 9 并且它们都是 'this' 颜色,那么 return 这个字符串。

创建 Swing 应用程序时,还应该创建应用程序的逻辑模型。这是 model / view / controller 模式的示例。

通过分离 Swing 应用程序的逻辑部分,您可以一次专注于应用程序的一部分。

这是我测试过的 GUI。如您所见,结果文本显示“获胜者!”。

我创建了一个 GameModel class 来保存游戏模型,并创建了一个 ButtonModel class 来保存 JButton 的值和颜色。

测试所有九个 ButtonModel 的方法是 GameModel class 的 isMatch 方法。您可以看到如何使用模型极大地简化了 ColourButton class.

actionListener 方法

这是代码。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JButtonTesting {

    public static void main(String[] args) {
        new JButtonTesting();
    }

    private GameModel model;

    public JButtonTesting() { // CONSTRUCTOR.
        this.model = new GameModel();
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Colour Button 4.0");
                frame.add(new ColourButton());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ColourButton extends JPanel implements ActionListener {
        private static final long serialVersionUID = 1L;

        Random rand = new Random();
        JButton buttons[]; // created a button array.
        JLabel gameRules = new JLabel("Match the colour buttons.");
        JLabel timer = new JLabel("00:00 (placeholder)");
        JLabel result = new JLabel("Result: (placeholder)");
        int value = 0;

        public ColourButton() {
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
            gameRules.setAlignmentX(JLabel.CENTER_ALIGNMENT);
            add(gameRules);
            JPanel buttonPanel = createButtonPanel();
            add(buttonPanel);
            timer.setAlignmentX(JLabel.CENTER_ALIGNMENT);
            add(timer);
            result.setAlignmentX(JLabel.CENTER_ALIGNMENT);
            add(result);
        }

        private JPanel createButtonPanel() {
            JPanel buttonPanel = new JPanel();
            buttons = new JButton[9];
            buttonPanel.setLayout(new GridLayout(0, 3));
            for (int i = 0; i < buttons.length; i++) {
                buttons[i] = new JButton("colour button");
                buttons[i].setActionCommand(Integer.toString(i));
                buttons[i].setBorderPainted(false);
                buttons[i].setContentAreaFilled(false);
                buttons[i].setOpaque(true);
                buttons[i].addActionListener(this);
                buttonPanel.add(buttons[i]);
            }
            return buttonPanel;
        }

        public void setButtonColour(int index, Color colour) {
            buttons[index].setBackground(colour);
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            if (!(event.getSource() instanceof JButton)) {
                return;
            }

            int buttonIndex = Integer.valueOf(event.getActionCommand());
            System.out.println(buttonIndex + " button clicked.");

            value++;
            value %= 9;
            
            model.setColour(buttonIndex, value);
            setButtonColour(buttonIndex, model.getColour(buttonIndex));
            
            if (model.isMatch()) {
                result.setText("Winner!");
            }
        }

    }

    public class GameModel {

        private Color[] colours = { null, Color.RED, Color.ORANGE, Color.YELLOW, 
                Color.GREEN, Color.CYAN, Color.BLUE,
                Color.MAGENTA, Color.PINK };

        private ButtonModel[] buttonValues;

        public GameModel() {
            buttonValues = new ButtonModel[9];
            for (int i = 0; i < buttonValues.length; i++) {
                buttonValues[i] = new ButtonModel();
                setColour(i, 0);
            }
        }
        
        public Color getColour(int index) {
            return buttonValues[index].getColour();
        }
    
        public void setColour(int index, int value) {
            buttonValues[index].setValue(value);
            buttonValues[index].setColour(colours[value]);
        }

        public boolean isMatch() {
            int value = buttonValues[0].getValue();
            for (int i = 1; i < buttonValues.length; i++) {
                if (buttonValues[i].getValue() != value) {
                    return false;
                }
            }
            return true;
        }
    }

    public class ButtonModel {

        private int value;

        private Color colour;

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public Color getColour() {
            return colour;
        }

        public void setColour(Color colour) {
            this.colour = colour;
        }

    }

}