在 Swing 中使用空布局时,我的组件直到我悬停在它们上才会显示



最近我一直在用Java制作一些简单的Swing游戏。我目前的项目是一款类似国际象棋的游戏,所以我决定先用JButtons制作一个8 * 8的网格,然后再开始。

问题是,每次我运行我的应用程序,一半的按钮都不见了,只有当我把鼠标悬停在它们上面时它们才会出现。从我对这个问题的搜索来看,大多数建议都说我不应该使用null布局,我应该使用Swing中已经存在的一些布局。但是从我目前所看到的来看,Swing布局只是一个痛苦的工作(至少与Android的布局相比),我现在更喜欢使用绝对定位。

我还发现添加panel.repaint();修复了缺失的按钮,但我不喜欢这个解决方案,因为它并没有真正解决问题,而更像是在修补它。当我用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
    }
}

通常情况下,在添加面板及其组件后,会执行last:

frame.pack();
frame.setVisible(true);

pack()正在做一些布局的首选尺寸。

也可以做一个8x8的JTable

避免使用null布局的原因有很多。不同的平台会以不同的方式对待它们。它们很难维护,原因还有很多。相反,使用布局管理器,让它们来完成组件的布局和大小调整,就像它们被设计用于Swing应用程序一样。了解更多关于在容器内布局组件的信息

对于一个国际象棋游戏,它听起来像GridLayout将是理想的你正在寻找的,没有同样的问题,你目前正在经历。

首先,您需要在事件线程上进行绘制。其次,你应该创建一个类来扩展JPanel,如果你真的想使用null布局,你的面板应该覆盖paintComponent,并且该方法应该首先调用super.paintComponent(),然后适当地定位子按钮。

相关内容

  • 没有找到相关文章

最新更新