2013-02-13 100 views
0

我想創建一個帶有文本欄,進度條和不是的狀態欄。然而,事情正在絞盡腦汁。JLabel調整大小JPanel

起初,我只用了文字欄和狀態欄下面的例子中看起來像(我並不需要父容器):

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Main 
{ 
    public static void main(String[] args) 
    {   
     //Display actual GUI 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Gui(); 
      } 
     }); 
    } 
} 

class Gui 
{ 
    public Gui() 
    { 
     JFrame masterWindow = new JFrame(); 

     masterWindow.setSize(1100, 800); 
     masterWindow.setMinimumSize(new Dimension(400, 400)); 
     masterWindow.setLocationRelativeTo(null); 
     masterWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel rootPanel = new JPanel(); 
     rootPanel.setLayout(new BorderLayout()); 

     StatusBar statusBar = new StatusBar(); 
     rootPanel.add(statusBar, BorderLayout.SOUTH); 

     masterWindow.setContentPane(rootPanel); 
     masterWindow.setVisible(true); 
    } 
} 

class StatusBar extends JLabel 
{ 
    private static final long serialVersionUID = 1L; 

    StatusBar() 
    { 
     super("welcomeText"); 
     add(textBar); 

     setOpaque(true); 
     setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
    } 
} 

這工作,因爲它應該。但是,請牢記狀態欄的高度。現在,如果將StatusBar類更改爲下面的類,則高度將幾乎翻倍。爲什麼會發生?

它不喜歡這樣的設置需要更多的垂直空間:

public class StatusBar extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 

    StatusBar() 
    { 
     super(); 

     JLabel textBar = new JLabel(Main.language.getString("welcomeText")); 
     add(textBar); 

     setOpaque(true); 
     setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
    } 
} 

這究竟是爲什麼,以及如何阻止它?

編輯: BorderLayout確實工作,但我想使用MigLayout。

我想通了,但現在來了另一個問題。額外的progresBar不會停靠在東邊,分隔符甚至不可見。

下面的代碼:

public class StatusBar extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 
    JLabel textBar; 
    JProgressBar progressBar; 

    StatusBar() 
    { 
     setLayout(new MigLayout("insets 0, gap 0!")); //Mig has some gaps inbetween components, this will remove the gaps 

     textBar = new JLabel(Main.language.getString("welcomeText")); 

     progressBar = new JProgressBar(0, 100); 

     JSeparator separator = new JSeparator(SwingConstants.VERTICAL); 

     add(textBar); 
     add(separator); 
     add(progressBar, "east"); 

     setOpaque(true); 
     setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
    } 
} 

我可以使這個新的問題,但我不認爲這是值得的......

+0

你爲什麼不看看源代碼或可能通過一個調試器中運行該代碼? – mre 2013-02-13 01:51:29

回答

1

它的原因是,調用super()將執行超類的no-arg構造函數,在您的情況下JPanel。根據javadoc

JPanel() - 使用雙緩衝區和流佈局創建一個新的JPanel。

因此,當您調用super()時,會創建一個帶有FlowLayout的JPanel。

嘗試改變佈局BorderLayout

1

設置JPanel的佈局BorderLayout

class StatusBar extends JPanel 
    { 
     private static final long serialVersionUID = 1L; 

     StatusBar() 
     { 
      super(); 
      this.setLayout(new BorderLayout()); //set layout 
      JLabel textBar = new JLabel(Main.language.getString("welcomeText")); 
      add(textBar); 

      setOpaque(true); 
      setBorder(BorderFactory.createLoweredBevelBorder()); 
     } 
    } 
+0

好的,那可行,雖然不適合我,因爲我需要更強大的佈局。 但是,更重要的是,這並沒有說爲什麼。 – Karlovsky120 2013-02-13 02:03:57

相關問題