在Swing中使用null布局时,我的组件不会出现,直到我将它们悬停在它们上面

时间:2015-07-07 13:28:57

标签: java swing user-interface layout jbutton

最近,我开始使用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
    }
}

3 个答案:

答案 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()然后适当地定位子按钮。