2016-10-31 2 views
0

스크롤 바를 사용하지 않고 부모와 크기를 조정할 수있는 스크롤 바를 사용하지 않고 편집 할 수없는 단어 줄 바꿈 가능한 텍스트 레이블/필드/영역이 필요합니다. 다양한 크기의 텍스트를 표시하는 데 사용되지만 "항상"전체 텍스트를 표시 할 공간이 충분합니다. 드물 긴하지만 사용자가 창 크기를 너무 작게 조정하여 크기가 맞지 않을 경우 줄/세로 줄을 자르고 싶습니다.FormLayout으로 줄 바꿈을 사용하여 JTextArea를 축소하려면 어떻게해야합니까?

저는 많은 문제를 조사해 왔으며 문제의 근원에 도달하지 않고 여기서 찾을 수있는 관련 질문을 읽었습니다. 나는 그것의 단어 감싸는 능력 때문에 JTextArea을 선택했다. 또한 JLabel의 사용자 지정 확장을 시도했지만 문제가 그대로 남아 있으므로 JTextArea을 그대로 사용할 수 있습니다. HTML 접근 방식은 여러 가지 이유로 정말 피하고 싶습니다. 이 문제에 처음으로 부딪혔을 때가 아니고 이전에 레이아웃을 손상시킴으로써 해결했습니다 (다른 방식으로 양식 디자인하기). 이 문제에 직면 한 것은 이번이 마지막 일이 아니기 때문에 타협을 유지하는 대신 방법을 찾아야한다고 생각했습니다.

문제는 처음에 의도 한대로 작동하고 창 크기를 가로로 크게 조정하면 창을 가로로 축소해도 단어 줄 바꿈이 업데이트되지 않으므로 JTextArea은 가로로 잘립니다.

내 테스트 결과 일부 레이아웃 관리자에게만 해당되는 것으로 나타 났지만 문제가 실제로 어떤 수준인지는 확실하지 않습니다. 또한 어딘가에 문제가 Windows에서만 존재한다는 것을 읽었지 만 검증/테스트를하지 않았습니다.

  • FormLayout : 그래서 내가 아는 모든 문제가 저를 위해 여기 있다는 것입니다 및 Java 7 및 Java와 8

    테스트 다른 레이아웃 매니저가 나타났습니다 모두 존재 개발 Windows를 사용하고 아무튼를 축소 할 때 다시 감싸기.

  • MigLayout : 축소 할 때 다시 감싸지 않습니다.
  • GridBagLayout : 축소 할 때 다시 감싸지만 올바르게 표시되지 않으므로 일부 텍스트가 숨겨집니다.
  • BorderLayout : 예상대로 작동합니다.
  • BoxLayout : 축이 Y_AXIS으로 설정된 경우 예상대로 작동합니다. X_AXIS으로 설정하면 FormLayout 또는 MigLayout처럼 작동합니다.
  • GridLayout : 예상대로 작동합니다.
  • CardLayout : 예상대로 작동합니다.

기존 응용 프로그램은 FormLayout을 광범위하게 사용하며 완전히 다시 작성하지 않으면 변경할 수 없습니다. JTextAreaJPanel으로 포장하여 작업 레이아웃 중 하나 (예 : BorderLayout)를 사용하면 "깨진"레이아웃 중 하나가 계층에서 더 많이 사용되는 한 도움이되지 않습니다. 잃어버린 신호가 아이들에게 미치지 못하는 것 같아서 현실적으로 계층 구조 맨 위로 FormLayout을 제거 할 수 없기 때문에 붙어 있습니다.

여기에 몇 가지 유사한 질문이 많이 있지만 대부분 또는 다른 약간의 변형과 함께 JTextArea과 조합되어 있으며 아무도 작동하는 해결책을 찾을 수 없었습니다. 가능한 한 문제를 좁히고 SCCEE를 제공함으로써 나는 중복으로 거부되지 않기를 희망합니다.

SCCEE :

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 
import com.jgoodies.forms.layout.FormLayout; 
import com.jgoodies.forms.layout.ColumnSpec; 
import com.jgoodies.forms.layout.RowSpec; 
import javax.swing.JTextArea; 



public class MainFrame { 

    private JFrame frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       try { 
        MainFrame window = new MainFrame(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public MainFrame() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       final JPanel panel = new JPanel(new FormLayout(
        new ColumnSpec[] {ColumnSpec.decode("pref:grow"),}, 
        new RowSpec[] {RowSpec.decode("pref:grow"),} 
       )); 
       frame.getContentPane().add(panel, BorderLayout.CENTER); 
       final JTextArea textArea = new JTextArea(); 
       panel.add(textArea, "1, 1, fill, fill"); 
       textArea.setLineWrap(true); 
       textArea.setText("Lorem ipsum dolor sit amet, ut eum assum debet tacimates, mei nisl electram moderatius ei, veri semper cotidieque eu pri. In quot noster vocent usu, ne augue voluptaria quo. Ex per malis vocibus. Consequat mediocritatem no vel."); 
    } 
} 

답변

1

당신은 아마 열 크기를 설정할 수 있습니다 ...하지만 당신은 또한 0,0에 텍스트 영역의 setPreferredSize을 설정할 수 있습니다 : 나는 그것을 인정하는 당황하고있어

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import com.jgoodies.forms.layout.ColumnSpec; 
import com.jgoodies.forms.layout.FormLayout; 
import com.jgoodies.forms.layout.RowSpec; 

public class Test extends JFrame { 
    final JPanel panel; 
    final JTextArea textArea; 
    final FormLayout fl; 
    public Test() { 
     this.setBounds(100, 100, 450, 300); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     fl = new FormLayout(
       new ColumnSpec[] {ColumnSpec.decode("pref:grow"), 
//      ColumnSpec.decode("pref:grow") 
         }, 
       new RowSpec[] {RowSpec.decode("pref:grow"), 
//      RowSpec.decode("pref:grow") 
         } 
      ); 
     panel = new JPanel(fl); 
     this.getContentPane().add(panel, BorderLayout.CENTER); 
     textArea = new JTextArea(); 
     textArea.setPreferredSize(new Dimension()); 

     panel.add(new JPanel().add(textArea), "1, 1, fill, fill"); 
//  panel.add(new JPanel().add(new JLabel("test")), "1, 2, fill, fill"); 
//  panel.add(new JPanel().add(new JLabel("test")), "2, 1, fill, fill"); 
     textArea.setLineWrap(true); 
//  textArea.setWrapStyleWord(true); 
     textArea.setText("Lorem ipsum dolor sit amet, ut eum assum " 
       + "debet tacimates, mei nisl electram moderatius ei, veri semper cotidieque eu pri. In quot noster vocent usu, " 
       + "ne augue voluptaria quo. Ex per malis vocibus. Consequat mediocritatem no vel."); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test().setVisible(true); 
      } 
     }); 
    } 
} 
+0

이게 단순한 것이었지만 그것은 사실이었다. 'textArea.setPreferredSize (새로운 차원())'은'''FormLayout'''과 함께 작동합니다. 나는 아직도 이유를 이해하지 못한다. 누군가가 설명하고 싶다면 그것을 고맙게 생각할 것이다. – Nadar

관련 문제