2010-07-29 30 views
0

這是我遇到的問題。我有一個JToolBar包含3個JPanel的和每個面板包含一些不同的組件。包含我的JProgressBar的面板只有在加載時纔可見。當它從可見變爲不可見時會發生什麼,其他兩個面板會移動大約1個像素。下面是代碼:當另一個不可見時,爲什麼Java GUI組件會移動?

private JProgressBar progressBar = new JProgressBar(JProgressBar.HORIZONTAL); 
private JPanel progressPanel = new JPanel(); 
private JPanel globalPanel = new JPanel(); 
private JPanel cameraPanel = new JPanel(); 
private JLabel cameraLabel = new JLabel("Camera: "); 
private JLabel cameraCoords = new JLabel(); 
private JLabel globalLabel = new JLabel("Global: "); 
private JLabel globalCoords = new JLabel(); 

progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.X_AXIS)); 
progressPanel.setBackground(Color.RED); 
globalPanel.setLayout(new BoxLayout(globalPanel, BoxLayout.X_AXIS)); 
globalPanel.setBackground(Color.BLUE); 
cameraPanel.setLayout(new BoxLayout(cameraPanel, BoxLayout.X_AXIS)); 
cameraPanel.setBackground(Color.GREEN); 

progressBar.setFocusable(false); 
progressBar.setPreferredSize(new Dimension(100,0)); 
progressBar.setMaximumSize(new Dimension(150,20)); 
progressBar.setStringPainted(true); 
//progressBar.setAlignmentY(Component.CENTER_ALIGNMENT); 

progressPanel.add(progressBar); 
//globalLabel.setAlignmentY(Component.CENTER_ALIGNMENT); 
//globalCoords.setAlignmentY(Component.CENTER_ALIGNMENT); 
globalPanel.add(globalLabel); 
globalPanel.add(globalCoords); 

//cameraLabel.setAlignmentY(Component.CENTER_ALIGNMENT); 
//cameraCoords.setAlignmentY(Component.CENTER_ALIGNMENT); 
cameraPanel.add(cameraLabel); 
cameraPanel.add(cameraCoords); 


this.setBorder(new EmptyBorder(5,5,5,5)); 
this.setPreferredSize(new Dimension(0,30)); 
this.add(progressPanel); 
this.add(Box.createHorizontalGlue()); 
this.addSeparator(); 
this.add(globalPanel); 
this.addSeparator(); 
this.add(cameraPanel); 
this.setFloatable(false); 

現在,當過我設置progressPanel.setVisible(false)JLabel的移一個像素。在哪裏我將路線註釋掉是我試圖讓它們對齊的位置,但這仍然無效。我在這裏做錯了什麼?

+0

水平或垂直?如果你有一個地方來託管它,一個applet將會很有用。 – 2010-07-29 19:24:24

+0

工具欄是水平的,但標籤垂直移動。當組件可見時,標籤向上移動,然後在不可見時返回「正常」。我將包含標籤的面板的背景着色,並確認它實際上是標籤的移動,而不是整個面板本身。我沒有任何東西來承載它。 – heater 2010-07-29 19:57:07

+0

我解決了我的問題,它是由我用於JToolBar的BoxLayout引起的,我也將JToolBar換成了JPanel。我仍然不知道是什麼導致了這種行爲,但切換到邊界佈局解決了我的問題。 – heater 2010-07-29 21:39:31

回答

0
public class StatusBar extends JPanel{ //Instead of JToolBar 
    private JProgressBar progressBar = new JProgressBar(JProgressBar.HORIZONTAL); 
    private JPanel progressPanel = new JPanel(); 
    private JPanel globalPanel = new JPanel(); 
    private JPanel cameraPanel = new JPanel(); 
    private JLabel cameraLabel = new JLabel("Camera: "); 
    private JLabel cameraCoords = new JLabel(); 
    private JLabel globalLabel = new JLabel("Global: "); 
    private JLabel globalCoords = new JLabel(); 

    public StatusBar(){ 
     progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.X_AXIS)); 
     globalPanel.setLayout(new BoxLayout(globalPanel, BoxLayout.X_AXIS)); 
     cameraPanel.setLayout(new BoxLayout(cameraPanel, BoxLayout.X_AXIS)); 

     progressBar.setFocusable(false); 
     progressBar.setPreferredSize(new Dimension(100,0)); 
     progressBar.setMaximumSize(new Dimension(150,20)); 
     progressBar.setStringPainted(true); 

     progressPanel.add(tileLoadingLabel); 
     progressPanel.add(Box.createHorizontalStrut(5)); 
     progressPanel.add(progressBar); 
     globalPanel.add(globalLabel); 
     globalPanel.add(globalCoords); 
     globalPanel.add(separator); 
     globalCoords.setPreferredSize(new Dimension(150,0)); 

     //Here is where I made the change(after extending JPanel and not JToolBar 
     //I used the BorderLayout instead of the BoxLayout 
     this.setLayout(new BorderLayout()); 
     this.setBorder(new EmptyBorder(5,5,5,5)); 
     this.setPreferredSize(new Dimension(0,30)); 
     this.add(globalPanel,BorderLayout.WEST); 
     this.add(Box.createHorizontalGlue()); 
     this.add(progressPanel,BorderLayout.EAST); 
    } 
} 

我也沒多想發佈自己的答案,我會知道的未來,感謝您的見解:)

相關問題