[英]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.