JButton只在程序最初启动时才能正常工作

时间:2016-12-08 05:46:38

标签: java swing jbutton jlabel n-queens

我正在努力解决N-Queens问题。在我的框架中,我有一个可点击的JButtons棋盘,如果你点击其中一个女王被放在那里,如果没有女王那里开始。如果那里已经有女王,它会移除女王。还有一个BoxList对象的ArrayList,用于跟踪Queens占用的Boxes。 我最初遇到的问题似乎是我的按钮动作监听器,告诉用户解决方案是否正确。

https://giphy.com/gifs/3oriOaGdBbOrr1xGwM?status=200

但我不确定这是不是确切的问题。当我运行程序并按下" safe" JButton,当电路板上没有任务时,它会显示正确的信息。但是,当我添加一个女王,然后把它带走,它没有显示消息。我已经调试了,我知道Box正在被正确删除,所以它可能是其他东西。这是全班。

    import javax.swing.*;
    import javax.swing.border.LineBorder;
    import java.awt.Color;
  import java.awt.GridLayout;
  import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.*;

public class ChessBoardGUI extends JFrame {
ImageIcon queenP = new ImageIcon(getClass().getResource("/images/queen.png"));
Image img = queenP.getImage();
Image newImg = img.getScaledInstance(40, 40, java.awt.Image.SCALE_SMOOTH);
ImageIcon queenPic = new ImageIcon(newImg);
private static JButton tip;
private static JButton safe;
private static JLabel ifNotSafe;
private JButton[][] chessBoxes = new JButton[8][8];
public static JPanel chessBoard;
public static ArrayList<Boxes> queensOnBoard = new ArrayList<Boxes>(); 

/*
 * Makes the whole frame for the ChessBoard
 */
public ChessBoardGUI() {
    createBoard();
    createOtherThings();
    setSize(500, 500);

}

/*
 * Creates the Tip and Safe buttons And Label to display when the solution
 * is incorrect
 */
public void createOtherThings() {
    safe = new JButton("Safe?");
    tip = new JButton("Tip");
    ifNotSafe = new JLabel();

    ButtonListen1 safeListener = new ButtonListen1();
    ButtonListen2 tipListener = new ButtonListen2();

    safe.addActionListener(safeListener);
    tip.addActionListener(tipListener);

}

/*
 * ActionListener for the safe button
 */
class ButtonListen1 implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // Tells user which queens are not safe
        if (checkSolution(queensOnBoard) == true) {
            ifNotSafe.setText("This Solution is correct so far");

        } else {
            ifNotSafe.setText("This Solution is incorrect so far");
            // *********Also highlight the queens that are not safe******
        }
    }

}

/*
 * ActionListener for the tip button
 */
class ButtonListen2 implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // ********Tells the user other places to put queens********
    }
}

/*
 * Creates the overall ChessBoard
 */
public void createBoard() {
    GridLayout gridLayout = new GridLayout();
    gridLayout.setRows(8);
    gridLayout.setColumns(8);
    chessBoard = new JPanel(gridLayout);
    chessBoard.setSize(400, 400);
    chessBoard.setBorder(new LineBorder(Color.BLACK));
    chessBoard.setVisible(true);

    /*
     * Loops through to add each chessBox to the chessBoard
     */
    for (int x = 0; x < 8; x++) {
        for (int y = 0; y < 8; y++) {
            chessBoxes[x][y] = new JButton();
            chessBoxes[x][y].setBorderPainted(false);
            /*
             * Assigns a color to every other box
             */
            if ((x + y) % 2 == 0) {
                chessBoxes[x][y].setBackground(Color.BLACK);
            } else {
                chessBoxes[x][y].setBackground(Color.WHITE);
            }
            chessBoxes[x][y].setOpaque(true);
            chessBoard.add(chessBoxes[x][y]);

            // Adds the ActionListener to each chessBox
            BoxListener boxListen = new BoxListener();
            chessBoxes[x][y].addActionListener(boxListen);
        }
    }
}

/*
 * Action Listener for if the individual boxes on the ChessBoard are clicked
 */
class BoxListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton button = ((JButton) e.getSource());

        // Runs through a loop to find the X and Y coordinate of the
        // JButton(Box) that was clicked
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                if (chessBoxes[x][y] == button) {
                    /*
                     * If there is No Queen at that JButton
                     */
                    if ((isOnBoard(queensOnBoard, x, y) == false)) {
                        // Makes sure the user can not place more than
                        // 8 Queens on the board
                        if (queensOnBoard.size() < 8) {
                            // Sets Picture of Queen on box
                            button.setIcon(queenPic);
                            // Adds box to the ArrayList of occupied boxes
                            queensOnBoard.add(new Boxes(x, y));
                        }
                    }
                    /*
                     * If there is a Queen at that JButton
                     */
                    else {
                        removeQueen(queensOnBoard, x, y);
                        button.setIcon(null);
                    }
                }
            }
        }
    }
}

/*
 * Checks if a certain Box has a Queen in it or not
 * 
 * @param a Is the ArrayList of the Boxes currently occupied by Queens
 * 
 * @param x Is the X coordinate of the Box that was clicked
 * 
 * @param y Is the Y coordinate of the Box that was clicked
 */
public boolean isOnBoard(ArrayList<Boxes> a, int x, int y) {
    for (int i = 0; i < a.size(); i++) {
        if (((a.get(i)).getX() == x) && ((a.get(i)).getY() == y)) {
            return true;
        }
    }
    return false;
}

/*
 * Removes a Queen from the GUI at the specified Box (JButton)
 * 
 * @param a Is the ArrayList of the Boxes currently occupied by Queens
 * 
 * @param x Is the X coordinate of the Box that was clicked
 * 
 * @param y Is the Y coordinate of the Box that was clicked
 */
public void removeQueen(ArrayList<Boxes> a, int x, int y) {
    /*
     * Removes the box from the overall ArrayList of Boxes Occupied by
     * queens according to the x and y location
     */
    for (int i = 0; i < a.size(); i++) {
        if (((a.get(i)).getX() == x) && ((a.get(i)).getY() == y)) {
            queensOnBoard.remove(i);
        }
    }
}

/*
 * Return to the user which queens need to be highlighted
 * 
 * @param queensOnBoard Is the ArrayList of Boxes that are occupied by
 * Queens currently on the ChessBoard
 */
public void conflictingQueens(ArrayList<Boxes> queensOnBoard) {
    // *******Call the highlightBoxes method using the ArrayList
    // Of Boxes you get from this method

}

/*
 * Checks to see if solution is correct thusfar
 * 
 * @param queensOnBoard Is the ArrayList of Boxes that are occupied by
 * Queens currently on the ChessBoard
 */
public boolean checkSolution(ArrayList<Boxes> queensOnBoard) {
    int size = queensOnBoard.size();
    if (size < 1) {
        return true;
    }
    if (size == 1) {
        return true;
    }
    for (int x = 0; x < size - 1; x++) {
        for (int y = 1; y < size; y++) {
            // Checks if Queen is safe from horizontal attacks
            if (queensOnBoard.get(x).getX() == queensOnBoard.get(y).getX()) {
                return false;
                // Checks if Queen is safe from vertical attacks
            } else if (queensOnBoard.get(x).getY() == queensOnBoard.get(y).getY()) {
                return false;
                // Checks if Queen is safe from diagonal attacks
                // Uses diagonalAttack(queensOnBoard) as a helper method
            } // else if(){
                // return false;
                // }
        }
    }

    return true;
}

/*
 * Checks to see if the queen is safe from diagonal attacks
 * 
 *
 */
// public boolean diagonalAttack(ArrayList<Boxes> queensOnBoard){
 //********
// }

/*
 * Highlights boxes that are conflicting with one another
 * 
 * @param highlight Is the ArrayList of Boxes that are occupied by Queens
 * currently on the ChessBoard
 */
public void highlightBoxes(ArrayList<Boxes> highlight) {
    int size1 = highlight.size();
    int size2 = queensOnBoard.size();

    // When there aren't any queens at risk, this block
    // changes the background colors of the boxes back to
    // Their respective color
    if ((size1 == 0) && size1 == 1) {
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                chessBoxes[x][y] = new JButton();
                chessBoxes[x][y].setBorderPainted(false);
                /*
                 * Assigns a color to every other box
                 */
                if ((x + y) % 2 == 0) {
                    chessBoxes[x][y].setBackground(Color.BLACK);
                } else {
                    chessBoxes[x][y].setBackground(Color.WHITE);
                }
            }
        }
    }

    // Runs through both the highlight and queensOnBoard ArrayLists and
    // changes the background for the Queens at risk
    for (int b = 0; b < size2; b++) {
        for (int a = 0; a < size1; a++) {
            if ((highlight.get(a).getX() == queensOnBoard.get(b).getX())
                    && (highlight.get(a).getY() == queensOnBoard.get(b).getY())) {
                int x = queensOnBoard.get(b).getX();
                int y = queensOnBoard.get(b).getY();
                chessBoxes[x][y].setBackground(Color.RED);
            }
        }
    }
}

/*
 * Main method to run the program
 * 
 * @param args Is the String of args given to the console to run the
 * operations of the program
 */
public static void main(String[] args) {
    JFrame frame = new ChessBoardGUI();
    frame.add(chessBoard);
    chessBoard.setLocation(50, 50);

    JPanel panel1 = new JPanel();
    panel1.add(safe);
    panel1.add(tip);
    panel1.add(ifNotSafe);

    frame.add(panel1);
    frame.setTitle("ChessBoard");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

}

请原谅我没有完成一些零件。我已经评论出哪些空白部分最终会做什么。我遇到了这个问题,我遇到了障碍。如果我遗漏任何有用的东西,请告诉我。

0 个答案:

没有答案