Как удалить две кнопки, которые имеют одинаковые значения и цвета, нажав на них? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть матрица красочных кнопок, и мне нужно сравнить их цвета и их значения после нажатия на них.Все, что делает мой код - это удаление каждой кнопки без поиска значений или цветов. Также мне нужно добавить jlabel без перестановки кнопок j.Как я могу решить проблему?

public class Legos2 extends JFrame implements ActionListener{

    private static final long serialVersionUID = 1L;

    public JPanel jp = (JPanel)this.getContentPane();
    public JButton[][] jb = new JButton[12][24];//my matrix
    public static JLabel jl = new JLabel("score",SwingConstants.CENTER);//a jlabel to count the scores every time two buttons are removed

    public Legos2() {
        super();
        this.setSize(2000,2000);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        jp.setLayout(new GridLayout(12, 24));//size of my jpanel

        Random rnd = new Random();
        Color[] c = {Color.lightGray, Color.gray, Color.white,  Color.cyan};//colored jbuttons
        final int MAXCOLOR = c.length;
        JButton jb1;

        for(int i = 0;i <jb.length;i++) {
            for(int j = 0; j<jb[i].length; j++) {
                int k = (int) (Math.random()*9+1);//k is a random integer from 1 to 9
                jb1 = new JButton(Integer.toString(k));

                add(jb1);
                jb[i][j]=jb1;
                jb[i][j].addActionListener(this);
            }
        }

        for(int i=0; i<jb.length; i++){
            for(int j = 0; j<jb[i].length; j++) {
                jb[i][j].setBackground(c[rnd.nextInt(MAXCOLOR)]);//i add colors in here
            }
        }

        for (int row = 0; row < jb.length; row++) {
            for (int column = 0; column < jb[row].length; column++) {
                jb[row][column].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JButton button = (JButton) e.getSource();
                        String buttonText = button.getText();
                        // now iterate over all the jbuttons you have
                        for(int i=0;i<jb.length;i++){
                            for(int j=0;j<jb[0].length;j++){
                                JButton b = jb[i][j];
                                String bText = b.getText();
                                if(e.getSource()==b)
                                    if(buttonText.equals(bText)){
                                        b.setEnabled(false);

                                        jl.setText(Integer.toString(i));
                                    }
                            }
                        }
                    }
                }
                        );
                jp.add(jb[row][column]);
            }
        }
    }
}

1 Ответ

0 голосов
/ 30 декабря 2018

Ниже mcve требуемой функциональности.Пожалуйста, просмотрите и попросите разъяснения по мере необходимости:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Legos2 extends JFrame{

    private static final long serialVersionUID = 1L;
    private static final int ROWS = 12, COLS =24;
    public JButton[][] jb = new JButton[ROWS][COLS];
    private int score = 0;
    public static JLabel jl;

    public Legos2() {
        super();
        this.setSize(2000,2000);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel jp= new JPanel();
        jp.setLayout(new GridLayout(ROWS, COLS));

        Random rnd = new Random();
        Color[] c = {Color.lightGray, Color.gray, Color.white,  Color.cyan};
        final int MAXCOLOR = c.length;
        //all can be done in one loop
        for(int i = 0;i <jb.length;i++) {
            for(int j = 0; j<jb[i].length; j++) {
                int k = (int) (Math.random()*9+1);//k is a random integer from 1 to 9
                JButton button = new JButton(Integer.toString(k));
                button.setBackground(c[rnd.nextInt(MAXCOLOR)]);
                button.addActionListener(e -> {
                    disableTwoMatchingButtons(button);
                });
                jb[i][j]=button;
                jp.add(button);
            }
        }

        add(jp); //add panel at content pane center
        jl= new JLabel("",SwingConstants.CENTER);
        updateScore(0);
        add(jl, BorderLayout.PAGE_END); //add label at content pane bottom
        pack();
        setVisible(true);
    }

    private void disableTwoMatchingButtons(JButton button) {

        for(int i=0;i<jb.length;i++){
            for(int j=0;j<jb[0].length;j++){
                JButton b = jb[i][j];
                if(b.isEnabled() && button.getText().equals(b.getText()) &&
                                button.getBackground().equals(b.getBackground())){
                    b.setEnabled(false);
                    button.setEnabled(false);
                    updateScore(2* Integer.valueOf(b.getText()));
                    return;
                }
            }
        }
    }

    private void updateScore(int value) {
        score += value;
        jl.setText("Score: "+ score );
    }

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

Если вам нужно отключить все соответствующие кнопки, а не только две, используйте:

    private void disableAllMatchingButtons(JButton button) {

        for(int i=0;i<jb.length;i++){
            for(int j=0;j<jb[0].length;j++){
                JButton b = jb[i][j];
                if(b.isEnabled() && button.getText().equals(b.getText())
                                && button.getBackground().equals(b.getBackground())){
                    b.setEnabled(false);
                    updateScore(Integer.valueOf(b.getText()));
                }
            }
        }
    }

(вместо disableTwoMatchingButtons)
В будущем посте всегда рассмотрите возможность публикации mcve и придерживайтесь одного вопроса в посте.

...