2013-12-22 36 views
0

我有一個我偶爾添加一些組件的子面板。我期望FlowLayout正確地佈置它們。我把subPanel放在一個JScrollPane中,讓用戶看到所有的組件,但我不想打擾用戶水平滾動。但是JScrollPane讓subPanel在添加更多組件時水平擴展。通過這種方式,所有組件都水平顯示爲一行。這意味着最糟糕的佈局。防止JScrollPane擴展其viewPort組件

this.setLayout(new GridLayout(1, 1)); 
    subPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
    subPanel.setMaximumSize(new Dimension(500, 4000)); 
    subPanel.setBackground(Color.CYAN); 
    subPane = new JScrollPane(subPanel); 
    subPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    subPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    this.add(subPane); 

別的地方我已經加了的ComponentListener來解決這個問題,但問題仍然存在:

 @Override 
     public void componentShown(ComponentEvent e) { 
      subPanel.setSize(getSize()); 
     } 

     @Override 
     public void componentResized(ComponentEvent e) { 
      subPanel.setSize(getSize()); 
     } 

而且this是在JTabbedPane中完全所造成,因此佔據了所有的選項卡中的JPanel。

+1

不要使用ComponentListener來播放大小。佈局管理器將管理組件的首選大小,這反過來將允許滾動窗格正常工作。 – camickr

+0

您能否告訴我,JScrollPane使用哪個佈局來構造其獨特的組件?問題在於JScrollPane內部的組件佈局不受管理!所以我不同意,但我歡迎更好的解決方案。 @camickr – puk

+2

JScrollPane有一個自定義佈局管理器,你永遠不會改變它。佈局管理器負責管理視口,滾動條和列和行標題。所有你需要做的是確保你添加到滾動窗格的組件使用佈局管理器,我已經給你一個建議使用哪一個。 – camickr

回答

3

一個BoxLayout的也許您正在尋找Wrap Layout,當水平空間被填滿,將包裝組件到下一行。

+0

@puk:這是我在評論中提到我的答案。 –

+0

@camickr我發現了這個問題。無論如何,當我調整窗口大小時,FlowLayout會自動換行。所以我不需要這個第三方佈局。 – puk

+2

@puk,是的,它包裝,但它不正確計算首選的大小,所以滾動條將無法正常工作。 – camickr

2

通過這種方式,所有組件都水平顯示爲一行。這意味着最糟糕的佈局。

但這正是FlowLayout應該做的,正是它所做的。

爲什麼不乾脆用面向BoxLayout.PAGE_AXIS

+0

我可以得到最差的答案!我說這是最差的佈局,如果組件全部水平或垂直。他們應該填滿所有可見的空間,當沒有空間時,他們必須傾向於在垂直方向上延伸面板。如果你看看[這個例子](http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/layout /FlowLayoutDemoProject/src/layout/FlowLayoutDemo.java)你明白FlowLayout不應該做你說的話。我建議運行這個例子來看看我的意思。 – puk

+0

@puk:''我可以得到的最差的答案!'「 - - 我剛剛被放在我的位置!這聽起來像是你想創建一個自定義的佈局來做你想做的事(我聽說做這件事並不難,但我從來沒有這樣做過),或者搜索一個可以做的事情這個。 Rob camick(本網站上的用戶camickr)有一些您可以搜索的巧妙佈局。 –

+0

我不需要搜索佈局。當你評論我編輯我的答案。 FlowLayout對我來說非常完美,並且效果很好。我只需要添加一個滾動窗口讓用戶看到組件走出視口。 @Hovercraft – puk