Я работаю над игрой в шахматы для школьного проекта.У нас есть 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 в код выше, так как он работает нормально.Мы будем благодарны за любую помощь!:)