2016-04-18 3 views
1

20個のコンポーネント(JLabels)を挿入したJTextPaneがあります。残念ながら、すべてのラベルは1行にあります。JTextPane - 挿入されたJLabelコンポーネントの自動ラップ

JTextPaneが自動的に挿入されたオブジェクトをラップするように強制できますか?

enter image description here

package texteditor; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 

public class JTextPaneExample extends JPanel { 

    private JTextPane tp; 

    public JTextPaneExample() { 
     setLayout(new BorderLayout(0, 0)); 

     JPanel panel = new JPanel(); 
     add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BorderLayout(0, 0)); 

     JScrollPane scrollPane = new JScrollPane(); 
     panel.add(scrollPane, BorderLayout.CENTER); 

     tp = new JTextPane(); 
     tp.setEditable(false); 
     scrollPane.setViewportView(tp); 

     for (int i = 0; i < 20; i++) { 
      JLabel lbl = new JLabel("AAAA "); 
      lbl.setOpaque(true); 
      lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
      tp.insertComponent(lbl); 
     } 
    } 


    public static void main(String[] args) { 
     JFrame frame = new JFrame("GoBoard"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new JTextPaneExample()); 
     frame.setPreferredSize(new Dimension(400, 400)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

答えて

2

JTextPaneはスペースを囲みます。あなたの文書には空白がないので、何も折り返すことはありません。ラベル間にスペースを追加することもできます。

for (int i = 0; i < 20; i++) { 
    JLabel lbl = new JLabel("AAAA "); 
    lbl.setOpaque(true); 
    lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
    tp.insertComponent(lbl); 
    doc.insertString(doc.getLength(), " ", null); 
    tp.setCaretPosition(doc.getLength()); 
} 

また、JTextPaneを使用する理由はまだわかりません。 JPanelを使用して、パネル上のコンポーネントを次の行に折り返すことができます。このアプローチを使用したソリューションについては、Wrap Layoutを参照してください。

これは、クリックしたラベルを取得するためにドキュメントを検索する必要がない実際のコンポーネントを扱うため、最後の質問(JTextPane - get component values)の解決策をさらに簡単にするはずです。

1

あなたはLayoutManagerを使用する必要があり、この場合には、あなたは/あなた自身のLayoutManagerを(私は数年前に同様の問題のためにこれをしなければならなかった)を構築する必要がありますする必要があります。 LayoutManager layoutComponentメソッドで、ラベルのインデックスとその前のすべてのコンポーネントのすべてのpreferredsize.width/size.widthの長さを確認します。これがJTextPane preferredsize.width/size.widthより大きい場合は、次の行に移動します。

+0

'BorderLayout'を使用してコンテナに' JTextPane'を追加し、それを 'JScrollPane'に追加する必要があります(少なくとも過去に私のものがあります) – MadProgrammer

+0

私は好奇心が強いでしょうあなたの最終的な解決策。フォーラムに投稿してください。私は、JTextPanelで使用されるレイアウトマネージャーを見たことがありません。 JTextPaneでレイアウトマネージャを使用している場合は、なぜJTextPaneを使用しているのかという疑問があります。私には奇妙な解決策のようだ。 – camickr

+0

@MadProgrammer、私はこの質問で昼食をとっていると思う。私は答えやあなたの提案を理解していません。私はあなたのアプローチを使って過去のラッピングを防止しています。 [折り返しテキスト枠なし](https://tips4java.wordpress.com/2009/01/25/no-wrap-text-pane/)を参照してください。私が(ラップしている)私の提案を使用して、あなたの提案を追加するとき、ラッピングはありません。 – camickr

関連する問題