2014-01-23 65 views
1

我有一個包含JScrollArea的窗口,其中包含一個包含JTextArea的JPanel。當我調整窗口大小時,佈局會完美更新,但如果將窗口縮小,JPanel不會縮小其內容。我試圖在JScrollArea上添加一個ComponentListener來根據視口的新大小調整JPanel的大小,但是這似乎破壞了垂直滾動條的用途。JScrollPane可以調整較小的尺寸,但JTextArea不會

更新:這裏的想法是,JScrollArea將包含一個JPanel(因爲它只能包含一個組件的視口),在該JPanel中,我將添加多個包含組件的描述進程的JPanel,用戶。由於可以有任意數量的這些進程在運行,因此我需要有某種可用的滾動條功能。因此下面我使用的組件層次結構。

這裏需要的行爲是窗口可以調整大一些或小一些,文本區域會相應地包裹它的內容,如果JPanel的內容比窗口垂直的大,那麼會出現一個垂直滾動條。有什麼建議麼?

public class TestWindow extends JFrame { 
    JPanel scrollContentPanel; 
    JScrollPane scrollPane; 

    public TestWindow() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     this.setContentPane(mainPanel); 
     GridBagLayout mainPanelLayout = new GridBagLayout(); 
     mainPanel.setLayout(mainPanelLayout); 

     scrollContentPanel = new JPanel(); 
     scrollPane = new JScrollPane(); 
     scrollPane.setViewportView(scrollContentPanel); 
     scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
     GridBagLayout scrollContentLayout = new GridBagLayout(); 
     scrollContentPanel.setLayout(scrollContentLayout); 

     JPanel contentEntry = new JPanel(); 
     GridBagConstraints contentEntryConstraints = new GridBagConstraints(); 
     contentEntryConstraints.weightx = 1.0; 
     contentEntryConstraints.insets = new Insets(3, 3, 5, 3); 
     contentEntryConstraints.fill = GridBagConstraints.BOTH; 
     contentEntryConstraints.gridx = 0; 
     contentEntryConstraints.gridy = 1; 
     scrollContentPanel.add(contentEntry, contentEntryConstraints); 
     GridBagLayout contentEntryLayout = new GridBagLayout(); 
     contentEntry.setLayout(contentEntryLayout); 

     JTextArea descTextArea = new JTextArea(); 
     descTextArea.setEditable(false); 
     descTextArea.setFont(new Font("Dialog", Font.PLAIN, 11)); 
     descTextArea.setText("This is a description of an arbitrary unspecified length that may easily span multiple lines without any breaks in-between. Therefore it is necessary that the description automatically wrap as appropriate."); 
     descTextArea.setLineWrap(true); 
     descTextArea.setWrapStyleWord(true); 
     GridBagConstraints descTextAreaConstraints = new GridBagConstraints(); 
     descTextAreaConstraints.weightx = 1.0; 
     descTextAreaConstraints.weighty = 1.0; 
     descTextAreaConstraints.insets = new Insets(0, 0, 3, 0); 
     descTextAreaConstraints.fill = GridBagConstraints.BOTH; 
     descTextAreaConstraints.gridx = 0; 
     descTextAreaConstraints.gridy = 1; 
     descTextAreaConstraints.gridwidth = 2; 
     contentEntry.add(descTextArea, descTextAreaConstraints); 
     GridBagConstraints scrollPaneConstraints = new GridBagConstraints(); 
     scrollPaneConstraints.insets = new Insets(0, 0, 5, 0); 
     scrollPaneConstraints.weightx = 1.0; 
     scrollPaneConstraints.weighty = 1.0; 
     scrollPaneConstraints.fill = GridBagConstraints.BOTH; 
     scrollPaneConstraints.gridx = 0; 
     scrollPaneConstraints.gridy = 0; 
     mainPanel.add(scrollPane, scrollPaneConstraints); 

     scrollPane.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent evt) { 
       super.componentResized(evt); 

       scrollContentPanel.setPreferredSize(scrollPane.getViewportBorderBounds().getSize()); 
       scrollContentPanel.validate(); 
      } 
     }); 

     pack(); 
    } 

    public static void main(String[] args) { 
     TestWindow wnd = new TestWindow(); 
     wnd.setVisible(true); 
    } 
} 

回答

3

JTextArea應該直接放入JScrollPane,只要是你正試圖scrol組件湖如果還有其他項目要與其一起滾動(因此中間爲JPanel),那麼您可能需要考慮使JPanel執行Scrollable,以便JScrollPane知道如何處理它。 JTextArea執行Scrollable,這就是爲什麼它開箱即用JScrollPane

+0

沒有看到那個界面。感謝您的提示,它的工作! – Jesse

3
  • 沒有你的目標沒有詳細說明,解釋的想法

  • JTextArea應放置在JScrollPane

  • 集INTIAL setPreferredSizeJTextArea,例如JTextArea(5, 10)

  • 你放三JPanels(是有原因???這個組件層次)之一JScrollPaneJTextArea被直接放入JPanel而不是向JScrollPane

  • 那麼ComponentListener用法是無用的, contraproductive

+0

在問題中爲組件層次結構添加了一些說明。 – Jesse