2016-09-12 6 views
2

JTextpaneは、固定幅でも動的高さでも折り返しを許可する必要があります。高さは、ユーザーがテキストを追加または削除するときに変更する必要があります。私はJTextAreaを使用していましたが、テキストは違ったスタイルにする必要があります。この問題の簡単な方法はありますか?JTextPaneで固定幅で動的高さを設定する方法は?

+2

あなたが何かをしようと試みたのですか? –

答えて

1

水平スクロールなしのJScrollPaneを使用してください。

JFrame frame = new JFrame();  
JPanel pnel = new JPanel(); 
frame.setContentPane(pnel); 
JTextPane txtpane = new JTextPane();  
txtpane.setPreferredSize(new Dimension(200, 200)); 
JScrollPane jsp = new JScrollPane(txtpane,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
     JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
pnel.add(jsp); 
frame.pack(); 
frame.setVisible(true); 

これはテキストを囲みません。テキストをラップするためにこれらを見てみましょう: http://java-sl.com/wrap.htmlhttp://java-sl.com/tip_html_letter_wrap.html

を私はJTextAreaないJTextPane

2

を使用することをお勧めします私はすでに似たようなのための答えを書きました。 hereを確認してください。幅が設定されていない

  • 場合、getPreferredSizeメソッドはwidthが最も長い行の場合の幅になります寸法(幅、高さ)を返します:

    あなたはJTextPaneので返されるpreferredSizeがであることを理解する必要がありますそこには折り返しがありません。そして、height、無限の幅を持つペインにすべての線を表示するのに必要な高さです。

  • 幅が設定されている場合、getPrefferedSizeは、それがラップされた場合ラッピング不可、及びheight全体のテキストを表示するために必要な高さがない場合場合widthは最長の線の幅であろう寸法(幅、高さ)を返します現在の幅で。

この現象はなぜですか?

これは非常に簡単です。使用できる幅がわからない場合は、テキストを表すのに必要な高さを計算することはできません。

どのように動的に行うのですか?

JTextPaneのドキュメントにDocumentListenerを追加するのが最も良い方法です。その後、すべての変更にだけ、このコードを楽しんで

を説明するために

myJTextPane.setSize(myJTextPane.getWidth(),myJtextPane.getPreferredSize().height); 

を呼び出す:

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 

public class HelloWorld { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final JFrame mainFrame = new JFrame("test"); 
       mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       final JTextPane field = new JTextPane(); 
       field.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse accumsan magna vel libero bibendum, quis hendrerit nisi rutrum. Cras placerat erat eget dictum ornare. Sed eget nisl quis nibh vehicula mollis. Vestibulum non iaculis erat, quis pulvinar magna. Suspendisse ac rhoncus purus. Quisque finibus, dolor varius tincidunt aliquet, mauris felis condimentum neque, at viverra felis nulla at justo. Duis ut dui velit. Integer vitae mollis leo. Cras quis urna odio. Suspendisse tempus, urna sed maximus fringilla, ante velit finibus massa, id commodo libero quam non ipsum. Sed id augue vitae sapien sagittis imperdiet in eget nibh. Nam semper posuere nisl, dictum efficitur ipsum aliquet ac. Phasellus eros massa, fringilla et neque maximus, pretium tempor magna."); 

       mainFrame.getContentPane().setLayout(null); 
       mainFrame.getContentPane().add(field,BorderLayout.CENTER); 
       field.setLocation(0, 0); 
       field.setSize(200,40); 
       field.setSize(200, field.getPreferredSize().height); 
       mainFrame.setSize(300,500); 
       mainFrame.setVisible(true); 
       System.out.println(field.getPreferredSize().width+" , "+field.getPreferredSize().height); 
      } 
     }); 
    } 
} 
+0

ありがとうsharcoux、あなたのコードは私の問題を解決しました。 – mweetwa

+0

ようこそ。満足のいく答えが得られたら、左側のチェックを押して選択してください。 – Sharcoux

+0

@mweetwa、StackOverflowを初めて使用している場合は[こちら](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)をお読みください。 – Sharcoux

関連する問題