簡體   English   中英

在Swing中使用null布局時,直到將鼠標懸停在它們上時,我的組件才會顯示

[英]When using null layout in Swing, my components don't appear until I hover on them

最近,我開始使用Java中的Swing制作一些簡單的游戲。 我當前的項目是一個類似國際象棋的游戲,所以我認為我將從使用JButtons制作8 x 8網格開始,然后從那里開始。

問題在於,每次我運行應用程序時,都會丟失一半的按鈕,並且只有當我將鼠標懸停在它們上方時,它們才會出現。 從對這個問題的搜索中,大多數建議都說我不應該使用空布局,而應該使用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
    }
}

出於多種原因,請避免使用空布局。 不同的平台會區別對待它們。 除其他原因外,它們很難維護。 而是使用布局管理器,讓他們像設計用於Swing應用程序那樣對組件進行布局和調整大小。 布局容器中的組件時了解更多信息

對於國際象棋游戲,聽起來GridLayout非常適合您要尋找的東西,而不會遇到您當前遇到的相同問題。

通常,在添加面板及其組件之后, 最后要做的是:

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

pack()在首選大小上進行一些布局。

一個人也可以做一個JTable 8x8。

首先,您需要在事件線程上進行繪制。 其次,您應該創建一個擴展JPanel的類,如果您確實要使用null布局,則面板應覆蓋paintComponent,並且該方法應首先調用super.paintComponent(),然后適當地放置子按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM