2017-05-15 114 views
0

我的GUI在JTextPane中顯示日誌,JTextPane位於JScrollPane內,佔用JSplitPane的左側。 JSplitPane的右側包含GUI的有趣部分。日誌窗格的寬度通常較窄(20),但在用戶想要查看活動時會增加。如果日誌文本被打包,那麼當日志窗格很窄時,顯示的文本就毫無用處,但如果某些日誌條目很長,則需要增加日誌窗格的大小才能佔用大部分GUI以查看條目。當窗格寬度超過指定值時,將文本包裝在JTextPane中

我明白JTextPane不會自然地包裝文本,Stack Overflow上的其他貼子描述瞭如何包裝文本。不過,我希望文本只有在窗格較寬時提供一些限制,比如100。因此,當窗格很窄時,只顯示每條消息的開頭,並且如果用戶希望看到滿文本,窗格寬度會增加,並且文本將被封裝到窗口寬度。

如果沒有辦法做到這一點,我會關閉包裝並將文本格式化爲某種固定寬度,然後再將其寫入窗格。 在此先感謝!

+0

在你的paintComponent方法中使用'if(this.getWidth> 100)...'。 – Nathan

+0

因此,將ComponentListener添加到您的文本窗格並根據大小切換打開/關閉包裝。 – StanislavL

回答

2

我明白的JTextPane不自然環繞文字

這是不對的。默認情況下,JTextPane將包裝文本。

請參閱Text Pane No Wrap瞭解關於此主題的更多信息,這些信息構成了下面解決方案的基礎。

您需要覆蓋getScrollableTrackViewportWidth()方法。我覺得應該是:

JTextPane textPane = new JTextPane() 
{ 
    public boolean getScrollableTracksViewportWidth() 
    { 
     return getParent().getSize().width > 100; 
    } 
}; 

編輯:

這個問題似乎是相關的文本窗格中的文本。不知道如果是文本或文本中的非字母字符導致的不同長度:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class TextPaneNoWrap 
{ 
    private static void createAndShowGUI() 
    { 
     JTextPane textPane = new JTextPane() 
     { 
      @Override 
      public boolean getScrollableTracksViewportWidth() 
      { 
       Dimension d = getParent().getSize(); 
       System.out.println(d); 

       return false; 
      } 
     }; 
     textPane.setText("one two three four five six\nthis wraps at 39"); 
//  textPane.setText("import javax.swing.event.*;\nthis wraps at 111"); 

     JFrame frame = new JFrame("TextPaneNoWrap"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JLabel("Some Component"), BorderLayout.LINE_START); 
     frame.add(new JScrollPane(textPane)); 
     frame.setSize(300, 100); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 

EDIT2:

似乎用「包裝」面板時工作確定該實現Scrollable接口:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class TextPaneNoWrap 
{ 
    private static void createAndShowGUI() 
    { 
     JTextPane textPane = new JTextPane(); 

//  textPane.setText("one two three four five six\nthis wraps at 39"); 
     textPane.setText("import javax.swing.event.*;\nthis wraps at 111"); 

     JPanel wrapper = new NoWrapPanel(textPane); 

     JFrame frame = new JFrame("TextPaneNoWrap"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JLabel("Some Component"), BorderLayout.LINE_START); 
     frame.add(new JScrollPane(wrapper)); 
     frame.setSize(300, 100); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    static class NoWrapPanel extends JPanel implements Scrollable 
    { 
     public NoWrapPanel(JComponent component) 
     { 
      setLayout(new BorderLayout()); 
      add(component); 
     } 

     @Override 
     public Dimension getPreferredScrollableViewportSize() 
     { 
      return getPreferredSize(); 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) 
     { 
      return 20; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() 
     { 
      return true; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() 
     { 
//   return false; 
      return getParent().getSize().width > 100; 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) 
     { 
      return 10; 
     } 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

是的,我看到我的評論與未修改的JTextPane是否包裝文本的極性相反,謝謝。這個解決方案很好,主要。但是,如果我修改getScrollableTracksViewportWidth()以便它始終返回false,則不應該有文本包裝,這就是width => 131會發生什麼情況。當JTextPane的寬度<131時,文本將進行換行。有沒有情況下getScrollableTracksViewportWidth()的值被忽略?我沒有在JTextPane或包含它的JScrollPane上設置preferredSize或minimumSize。再次感謝。 – BruceS

+0

@BruceS,有趣,我確實看到相同的行爲。我不知道爲什麼會發生這種情況。對我來說就像一個錯誤。 – camickr

+0

感謝您驗證! – BruceS

相關問題