2011-01-11 33 views
0

我想要顯示一個具有水平滾動條的單行文本標籤(如有必要)。 (因爲我知道它是一行,所以沒有垂直滾動條。)miglayout行格式:包含單行JTextArea的JScrollPane

我正在通過一個包含JTextArea的JScrollPane實現。

對於佈局管理器,我使用MigLayout,似乎無法弄清楚用於行格式規範的內容。如果我只使用[],那麼它對於沒有水平滾動條的情況下可以正常工作,但是當滾動條出現時,由於滾動條佔據了所有空間,所以看起來很糟糕。

我想什麼做的是兩種:

  • 顯示JScrollPane的具有恆定的高度,看起來不錯時滾動條出現,並且有額外的空間時滾動條不存在
  • 顯示JScrollPane的具有可變高度,因此當滾動條不存在時,窗格的高度爲1行文本,或者當滾動條存在時,可以使用額外的空間來容納滾動條。
  • 以僅佔用1行文本的方式顯示JScrollPane(例如滾動條被改變,以便它吃掉右邊的一些水平空間有問題的文字)

有什麼建議嗎?

回答

2

爲了保持滾動條從視重疊,需要實現組件上的Scrollable接口JScrollPane包裝(在JTextArea你的情況),並有Scrollable.getScrollableTracksViewportHeight()回報true。有關示例實現,請參閱this answer

1

有趣的問題(我不是太有尋找到JPA我應該熱情)

基本上,它是沒有太大的佈局可能對自己做的事:ScrollPane的PREF大小的不同而不同的能見度水平滾動條。這需要客戶端代碼來動態地告訴管理人員如何處理待處理區域IMO。下面是一個代碼片段。

  • 它使用與也許可見水平滾動條(是的,女同胞們,我知道,那固定的大小應動態調整,以任何高度變化滾動窗格的水平滾動條屬性的固定大小的隱形啞分量:-)
  • 它在scrollPane的水平滾動條上安裝componentListener,根據可見性更改調整假人的隱藏模式並重新驗證包含面板。爲Win /雨雲

工作正常,有一個在金屬毛刺,雖然(也許其他的LAF),這需要一個幻數調整差異,以保持佈局穩定

JTextArea area = new JTextArea("starting ", 1, 10); 
    JScrollPane areaScrollPane = new JScrollPane(area); 
    areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    Dimension dim = areaScrollPane.getPreferredSize(); 
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    // get the height diff with/out horizontal scrollbar 
    int diff = dim.height - areaScrollPane.getPreferredSize().height; 
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

    LC lc = new LC().wrapAfter(2).debug(500); 
    final MigLayout layout = new MigLayout(lc); 
    final JPanel panel = new JPanel(layout); 
    panel.add(new JLabel("OneLineRow")); 

    panel.add(areaScrollPane); 
    // create and add an invisible filler 
    // note: metal needs magic adjust, dont know why 
    // diff -= 3; 
    final JComponent dummy = (JComponent) Box.createVerticalStrut(diff); 
    dummy.setVisible(false); 
    final String dummyConstraint = "span, hidemode "; 
    panel.add(dummy, dummyConstraint + "0"); 
    // component listener which adjusts hidemode of filler on 
    // scrollpane's horizontal scrollbar showing/hiding 
    ComponentAdapter adapter = new ComponentAdapter() { 

     /** 
     * @inherited <p> 
     */ 
     @Override 
     public void componentShown(ComponentEvent e) { 
      layout.setComponentConstraints(dummy, dummyConstraint + "2"); 
      panel.revalidate(); 
     } 

     /** 
     * @inherited <p> 
     */ 
     @Override 
     public void componentHidden(ComponentEvent e) { 
      layout.setComponentConstraints(dummy, dummyConstraint + "0"); 
      panel.revalidate(); 
     } 

    }; 
    areaScrollPane.getHorizontalScrollBar().addComponentListener(adapter); 
    panel.add(new JScrollPane(new JTable(20, 5)), "span"); 
    showInFrame(panel, "one line textArea"); 

反饋非常歡迎,也許我忽略了一個不太人爲的方法