JButton появляется только при наведении на него курсора при работе на ПК и вообще не работает на Mac - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю над игрой в шахматы для школьного проекта.У нас есть JFrame, в котором у нас есть только две панели, одна основная панель и панель внутри основной, которая содержит все шахматные фигуры.Мы представляем шахматные фигуры с JButtons.Таким образом, в основном у нас есть матрица JButton, представляющая игровое поле, и в зависимости от того, является ли квадрат на доске пустым или нет, у JButton есть значок шахматной фигуры или просто значок «пусто».

Проблема в том, чтокогда мы запускаем игру, все кнопки располагаются друг над другом.Но когда мы наводим курсор на рамку, кнопки появляются в сетке, как и планировалось.Но после каждого взаимодействия, то есть перемещения шахматной фигуры, кнопка исчезает, и нам приходится парить над областью, чтобы «перекрасить» ее так, как это должно быть.После каждого хода мы перерисовываем кадр в нашей ведьме ActionPerformed, которая, по нашему мнению, работает нормально.Все это происходит, когда мы работаем на ПК.На Mac все кнопки расположены друг над другом, но эффект наведения отсутствует, и мы не можем играть в игру.

Код ниже содержит нашу инициализацию панелей и то, как мы перекрашиваем доску..

private ChessGame game;
private JButton[][] board;
private JPanel contentPanel;
private JLabel mess = new JLabel();
private JLabel titel;
private JPanel panel;
private int n;
private JFrame frame;
private GridBagConstraints c;


ViewControl(ChessGame gm, int size){
    this.game=gm;
    this.n = size;

    //MainFrame
    this.frame = new JFrame("Game");
    //this.frame.getContentPane().setLayout(new GridLayout());

    // Content
    this.titel = new JLabel(this.game.gameName);
    this.panel = new JPanel(new GridLayout(size,size));

    // Panel to Store Content
    this.contentPanel = new JPanel(new GridBagLayout());
    this.c = new GridBagConstraints();

    // Stores Btns
    this.board =  new JButton[size][size];
}


private void add_buttons(){
    for(int i=0; i<this.n; i++){
        for(int j=0; j<this.n; j++){
            Btn newBtn  = new Btn(i, j);
            newBtn.addActionListener(this);
            newBtn.setColor(this.game.colorPicker(i, j));
            newBtn.setBackground(newBtn.getColor());
            this.board[i][j] = newBtn;
            this.panel.add(this.board[i][j]);
        }
    }
}

private void populateBoard(){
    for(int i=0; i<this.n; i++){
        for(int j=0; j<this.n; j++){
                if(this.game.getStatus(i, j) != null){
                    this.board[i][j].setIcon(this.game.getStatus(i, j).getImg());
                }
                else{
                    this.board[i][j].setIcon(null);
                    this.board[i][j].setText("");
                }
            }
        }
}

private void rePaintFrame(){
    this.populateBoard();
}

public static void main(String[] arg){
    ChessGame game = new ChessGame();
    int size = game.board.getSize();

    ViewControl vc = new ViewControl(game, size);

    vc.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    vc.frame.setSize(new Dimension(700, 700));


    vc.add_buttons();

    // Add Titel
    vc.c.gridheight = 1;
    vc.c.gridwidth = 4;

    vc.c.gridx = 0;
    vc.c.gridy = 0;

    vc.contentPanel.add(vc.titel, vc.c);

    // Add Board
    vc.c.gridheight = 4;
    vc.c.gridwidth = 4;

    vc.c.gridx = 0;
    vc.c.gridy = 1;

    vc.contentPanel.add(vc.panel, vc.c);

    // Add all in main Frame
    vc.frame.add(vc.contentPanel);

    vc.frame.setVisible(true);

    vc.rePaintFrame();

}

Мы думали, что есть какая-то ошибка контейнера.У нас есть возможность добавить JPanels в панель содержимого Frames, но это не имело никакого значения.Мы не включили наш ActionPerformed в код выше, так как он работает нормально.Мы будем благодарны за любую помощь!:)

...