最近,我开始使用Swing in Java制作一些简单的游戏。我目前的项目是一个类似国际象棋的游戏,所以我想我会先用JButton制作一个8乘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
}
}
答案 0 :(得分:3)
通常,在添加面板及其组件后,将会 last :
frame.pack();
frame.setVisible(true);
pack()
对首选尺寸进行了一些布局。
也可以做一个JTable 8x8。
答案 1 :(得分:2)
出于多种原因,请避免使用空布局。不同的平台将以不同方式对待它由于许多其他原因,它们难以维护。而是使用布局管理器,让他们进行组件的布局和大小调整,因为它们是为Swing应用程序设计的。请访问Laying out components Within a Container
了解详情对于国际象棋游戏,听起来GridLayout对于您正在寻找的内容来说是理想的,没有您目前遇到的同样问题。
答案 2 :(得分:0)
首先,您需要在事件线程上进行绘制。 其次,你应该创建一个扩展JPanel的类,如果你真的想使用null布局,你的面板应该覆盖paintComponent,该方法应该首先调用super.paintComponent()然后适当地定位子按钮。