2017-05-15 3 views
0

My GUI는 JSplitPane의 왼쪽을 차지하는 JScrollPane 안에있는 JTextPane에 로그를 표시합니다. JSplitPane의 오른쪽에는 GUI의 흥미로운 부분이 있습니다. 로그 창의 너비는 일반적으로 좁은 20이지만 사용자가 활동을 보려고 할 때 증가합니다. 로그 텍스트가 줄 바꿈 된 경우 로그 창이 좁 으면 표시된 텍스트는 거의 쓸모가 없지만 일부 로그 항목이 길면 항목을보기 위해 대부분의 GUI를 차지하도록 로그 창의 크기를 늘려야합니다.창 너비가 지정된 값을 초과하면 JTextPane에 텍스트 줄 바꿈

나는 JTextPane이 자연스럽게 텍스트를 감싸지 않는다는 것을 알고 있으며, Stack Overflow의 다른 게시물은 텍스트를 감쌀 수있는 방법을 설명합니다. 그러나 텍스트가 줄 바꿈 될 때만 텍스트를 래핑하고 싶습니다. 제공된 제한 인 100을 초과하면 창을 좁히고 싶습니다. 따라서 창이 좁 으면 각 메시지의 시작 부분 만 표시되고 사용자가 전체를보고 싶다면 텍스트의 경우 창 너비가 증가하고 텍스트가 창 너비로 줄 바꿈됩니다.

이렇게 할 방법이 없다면 배치를 해제하고 텍스트를 고정 폭으로 포맷 한 다음 창에 씁니다. 미리 감사드립니다.

+0

paintComponent 메소드에서'if (this.getWidth> 100) ... '를 사용하십시오. – Nathan

+0

그래서 TextPane에 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가 : 그것은 차이의 원인이 텍스트 또는 텍스트의 비 알파벳 문자의 길이 있는지 알고하지 마십시오

는 "래퍼"패널을 사용하는 경우 확인을 작동하는 것 같다가

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 또는 JTextPane을 포함하는 JScrollPane에 preferredSize 또는 minimumSize를 설정하지 않습니다. 고마워, 또. – BruceS

+0

@ 브루스, 흥미 롭다. 나는 같은 행동을 보았다. 왜 이런 일이 일어날 지 모르겠습니다. 나 한테 버그 같아. – camickr

+0

확인해 주셔서 감사합니다! – BruceS