2
不知道我是否犯了一個菜鳥錯誤,但在爲我的JFrame中的JPanel創建GridLayout時更改行參數似乎導致另一個JPanel完全消失:奇怪的擺動錯誤:設置GridLayout參數讓我的JPanel消失
下面的代碼的精簡版:
- 在GridBug構造設置我的佈局,並把一個子類的JPanel的BorderLayout.CENTER。這在我的原始代碼中做了其他的東西,但是這裏只是繪製一個框來顯示它正在顯示。
- 不知何故被添加到BorderLayout.PAGE_END底部面板的狀態使所述中心面板消失
- 特別地,改變GridLayout的行參數爲較高的值,通過中央面板消失,較低的值工作得很好
- 的代碼,因爲它現在是,沒有我的電腦上工作,如果我去掉一些代碼,以減少行參數,或者如果我不加選擇JLabel或子面板,然後它工作...
我不知道我在做什麼錯:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GridBug extends JFrame{
static class ImagePanel extends JPanel{
@Override
public Dimension getPreferredSize(){
return new Dimension(200,200);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
System.out.println("Painting image panel...");
g.setColor(Color.CYAN);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
public GridBug() {
setLayout(new BorderLayout());
/*PROBLEM CODE HERE*/
//add center image panel - does not appear depending on GridLayout settings in other panels
ImagePanel centerPanel = new ImagePanel();
add(centerPanel , BorderLayout.CENTER);
//add bottom panel
JPanel bottomPanel = new JPanel();
add(bottomPanel, BorderLayout.PAGE_END);
bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work
// bottomPanel.setLayout(new GridLayout(5,0)); //works
JPanel subPanel = new JPanel();
//if I pass more than 4 or so rows as param to gridlayout,
//then imagePanel is not displayed
subPanel.setLayout(new GridLayout(4,0)); //doesn't work
// subPanel.setLayout(new GridLayout(3, 0)); //works
//if I don't add this label - works
JLabel label = new JLabel("A Label:");
subPanel.add(label);
bottomPanel.add(subPanel); //if I don't add the subPanel it works fine
/*END OF PROBLEM CODE?*/
//set window params
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);
setLocationRelativeTo(null);
setVisible(true);
}
public static final void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GridBug();
}
});
}
}
謝謝!我從來沒有正常使用setSize(),忘了我這次設置了它。我不敢相信我花了很多時間來測試大量其他代碼,認爲這是一個完全不同的問題,只是單獨留下了這一行。 – mallardz