最近我开始使用 Java 中的 Swing 制作一些简单的游戏。我当前的项目是一个类似国际象棋的游戏,所以我想我应该先用 JButtons 制作一个 8 x 8 的网格,然后从那里开始。
问题是,每次我运行我的应用程序时,一半的按钮都会丢失,并且只有当我将鼠标悬停在它们上方时它们才会出现。根据我对这个问题的搜索,大多数建议都说我不应该使用 null 布局,而我应该使用 Swing 中已有的一些布局。但从目前为止我所看到的来看,Swing 布局使用起来很麻烦(至少与 Android 布局相比),而且我现在更喜欢只使用绝对定位。
我还发现添加 panel.repaint();修复了丢失的按钮,但我不喜欢这个解决方案,因为它并没有真正解决问题,而更像是修补它。当使用重绘运行我的应用程序时,我仍然会短暂地看到丢失的按钮,直到它们被重新绘制为止。
所以我要寻找的是为什么这种情况首先发生,以及有没有什么方法可以在不使用不良 Swing 布局的情况下避免这种情况发生。
import javax.swing.*;
public class Main {
static final int TILE = 70;
static final int WIDTH = 600;
static final int HEIGHT = 600;
public static void main(String[] args){
JFrame frame = new JFrame("Knight's tour");
frame.setSize(WIDTH, HEIGHT);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
JPanel panel = new JPanel();
panel.setLayout(null);
frame.add(panel);
JButton[][] tiles = new JButton[8][8];
for(int i = 0; i < 8; i++){
for(int j = 0; j < 8; j++){
tiles[i][j] = new JButton();
tiles[i][j].setLocation(i*TILE, j*TILE);
tiles[i][j].setSize(TILE, TILE);
panel.add(tiles[i][j]);
}
}
//panel.repaint(); //this thing fixes it, but I am looking for a better fix
}
}
最佳答案
通常情况下,添加面板及其组件后会执行最后操作:
frame.pack();
frame.setVisible(true);
pack()
在首选尺寸上进行一些布局。
也可以做 JTable 8x8。
关于java - 在 Swing 中使用空布局时,我的组件只有在将鼠标悬停在它们上时才会出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31269938/