使用 FlowLayout 或其他佈局管理器時,若在初始化元件前呼叫 setVisible(true),會導致視窗先顯示空白,後續加入的元件不會自動重繪,造成只有第一個元件顯示、背景顏色無效等問題。
public WindowUI() {
setBackground(Color.WHITE);
setBounds(500, 100, 800, 800);
setVisible(true); // ❌ 過早顯示
setDefaultCloseOperation(EXIT_ON_CLOSE);
init(); // 元件初始化在顯示之後
}
public WindowUI() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
init(); // 1. 先初始化所有元件與佈局
setBounds(500, 100, 800, 800);
setBackground(Color.WHITE);
setVisible(true); // 2. 最後才顯示視窗
}
setVisible(true) 會觸發視窗的 paint 機制,此時若元件尚未加入容器,畫面自然為空。add() 元件雖會標記需重繪,但某些 Look & Feel 或平台可能不會自動觸發完整重繪。show() 方法由呼叫端控制顯示時機。container.add(newComponent);
container.revalidate(); // 重新佈局
container.repaint(); // 重新繪製
| 現象 | 可能原因 | 解決 |
|---|---|---|
| 只有第一個元件顯示 | setVisible 在 init 前 | 調整順序 |
| 背景顏色不生效 | 未設定 opaque 或佈局覆蓋 | container.setOpaque(true); 設定背景於容器而非視窗 |
| 元件重疊/位置錯亂 | 未指定佈局管理器 | setLayout(new FlowLayout()) 或其他 |