2012-02-04 60 views
2

我有一個包含兩個JLabel的JPanel。該面板使用BorderLayout。當我調整面板,使其沒有足夠的垂直空間來顯示兩個標籤BorderLayout - 防止「中心」組件被「切斷」

一個JLabel的投入BorderLayout.CENTER位置,另外在BorderLayout.PAGE_END

,居中的標籤總是被覆蓋(切斷)通過PAGE_END位置的標籤。

由於居中標籤中顯示的信息比另一個更重要,我希望居中標籤重疊(或切斷)下面的標籤。

BorderLayout(和GridBagLayout)似乎總是從「上到下」繪製組件,而那些「稍後」繪製的組件將覆蓋之前繪製的組件。

有沒有什麼方法可以說服BorderLayout(或任何其他LayoutManager)假定某個組件應始終位於「頂部」?

我嘗試使用

panel.setComponentZOrder(label1, 1); 
panel.setComponentZOrder(label2, 0); 

但這並不有所作爲。

回答

2

一種方法是使用GridLayout的尊重首選尺寸的自定義變體。 PreferredSizeGridLayout使用PreferredBoundable實現就是一個例子。

附錄:這是我試過的測試代碼。如果沒有改變,下面的標籤在鞋面下方「滑動」,但您必須處理horizontalAlignment屬性。在頂層容器

public class PreferredLayoutTest extends JPanel { 

    public PreferredLayoutTest() { 
     this.setLayout(new PreferredSizeGridLayout(0, 1)); 
     this.add(createLabel("One")); 
     this.add(createLabel("Two")); 
    } 

    private JLabel createLabel(String s) { 
     JLabel label = new JLabel(s); 
     label.setOpaque(true); 
     label.setBackground(Color.lightGray); 
     label.setFont(label.getFont().deriveFont(36f)); 
     return label; 
    } 

    private void display() { 
     JFrame f = new JFrame("PreferredLayoutTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new PreferredLayoutTest().display(); 
      } 
     }); 
    } 
} 
+0

感謝您的鏈接,有趣的破解+1 – mKorbel 2012-02-04 20:23:22

+0

感謝您的鏈接。我也在想我自己的LayoutManager,但只是不想走上這條路。不確定PreferredSizeGridLayout是否會有幫助,因爲我實際上希望第二個標籤不*優先考慮大小。但是,也許我可以把一些東西放在一起,只對「主要」標籤的首選尺寸加以尊重。 – 2012-02-04 20:50:23

+0

我已經在上面添加了我的測試代碼。該設計的一個吸引人的方面是由'BoundableInterface'提供的隱式策略模式。您可能會使用庫存佈局管理器在一段時間內解決這個問題。 – trashgod 2012-02-05 00:33:42