java - 在 Swing 中使用空布局时,我的组件只有在将鼠标悬停在它们上时才会出现

标签 java swing user-interface layout jbutton

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

相关文章:

java - Netty Nio 中 promise 的异步更新

java - 如何改变TextPane的大小?

java - 显示 ImageIcon 的一部分

java - 在JavaFX中动态添加元素到窗口

android - 在 VideoView 前面显示 TextView?

Java自定义注释和动态数据库内容

java - Font.getNumGlyphs() 返回的数字

java - 是否有任何java类可以从cron表达式中获取日期

java - 如何从 JPanel 中删除 RigidArea

wpf - 如何在所有菜单上自动设置 InputGestureText?