2016-10-31 8 views
0

スクロールバーのない親のサイズを変更するスクロールバーのない編集不可能なワープラブルテキストラベル/フィールド/エリアが必要です。さまざまなサイズのテキストを表示するために使用されますが、フルテキストを表示するのに十分なスペースが常に存在します。まれに、ユーザーがウィンドウのサイズを小さくしてサイズに合わない場合は、垂直方向に線を切り捨ててください。FormLayoutでワードラップを使用してJTextAreaを縮小するにはどうすればよいですか?

私は非常に多くの検索をしてきましたが、問題の根本に到達せずにここで見つけることができる関連する質問を読みました。私はJTextAreaのワードラップ機能を採用しています。私もJLabelのカスタム拡張を試しましたが、問題は同じままですので、私はちょうど同様にJTextAreaに固執することができます。 HTMLアプローチは、私が実際に複数の理由で避けたいものです。これは私がこの問題に直面した最初のことではありません。レイアウトを妥協することでこれを解決しました(別の方法でフォームを設計する)。私はこの問題に直面するのは間違いありませんので、妥協するのではなく道を見つける必要があると思いました。

問題は、これは最初に意図したとおりに動作し、ウィンドウが水平方向に大きくなるようにサイズ変更されると、ウィンドウを水平に縮小してもワードラップが更新されず、したがって、JTextAreaが水平に切り捨てられる。

私のテストでは、これは一部のレイアウトマネージャーにのみ当てはまることが示されていますが、問題が実際にどのレベルにあるかはわかりません。私はまた、問題はWindows上にしか存在しないことをどこかに読んだことがありますが、私はそれを検証/テストしていません。

  • FormLayoutを統合:私は、私が知っているすべての問題は私のためにここにあるということで、Java 7とJavaで8

    テスト異なるレイアウトマネージャが示された両方の存在、開発のためのWindowsを使用していdoesnのを収縮すると再び巻き戻されます。

  • MigLayout:縮小時に再ラップしません。
  • GridBagLayout:縮小すると折り返しますが、正しくないので一部のテキストが非表示になります。
  • BorderLayout:期待どおりに動作します。
  • BoxLayout:軸がY_AXISに設定されている場合、期待どおりに動作します。 X_AXISに設定すると、FormLayoutまたはMigLayoutのように動作します。
  • GridLayout:期待どおりに動作します。
  • CardLayout:期待どおりに動作します。

既存のアプリケーションでは、FormLayoutが広く使用されています。まったく書き換えを行わずに変更することはできません。 のJPanelをワーキングレイアウトの1つ(例:BorderLayout)で囲むことは、「壊れた」レイアウトの1つがさらに階層内で使用されている限り役立ちません。紛失して子どもに届かない信号があるように見えるので、私は現実的に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(new Dimension())'は '' 'FormLayout'''で動作します。なぜなら、私はまだ理解していないので、誰かが説明したいと思うなら、私はそれを感謝するだろう。 – Nadar

関連する問題