2016-04-18 13 views
1

Ich habe JTextPane, wo ich 20 Komponenten (JLabels) eingefügt habe. Leider sind alle Etiketten in einer Zeile.JTextPane - auto wrap eingefügt JLabel Komponenten

Wie kann ich erzwingen, dass das JTextPane die eingefügten Objekte automatisch umschließt?

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); 
    } 
} 

Antwort

2

Ein JTextPane umschließt Leerzeichen. Ihr Dokument hat keine Leerzeichen, so dass Sie nichts umbrechen können.

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()); 
} 

Auch noch nicht sicher, warum Sie eine JTextPane dafür verwenden: Sie können einen Raum zwischen den Etiketten hinzufügen. Sie können einfach ein JPanel verwenden und die Komponenten auf dem Panel in die nächste Zeile umbrechen lassen. Eine Lösung mit diesem Ansatz finden Sie unter Wrap Layout.

Dies sollte auch die Lösung von Ihrer letzten Frage erleichtern (JTextPane - get component values), da Sie mit echten Komponenten beschäftigen werden, müssen Sie nicht das Dokument durchsuchen, um das angeklickte Etikett zu erhalten.

1

Sie benötigen einen LayoutManager, und in diesem Fall zu verwenden, sollten Sie Ihre eigenen Layoutmanager zu/haben zu bauen (ich hatte dies für ein ähnliches Problem vor Jahren zu tun). Überprüfen Sie in Ihrer LayoutManager layoutComponent-Methode den Index der Beschriftung und die Länge aller preferredsize.width/width.width aller Komponenten davor. Wenn dies größer ist als Ihre JTextPane preferredsize.width/size.width, verschieben Sie sie in die nächste Zeile.

+0

Hinzufügen der 'JTextPane' zu ​​einem Container mit einem' BorderLayout' und dann das Hinzufügen zu dem 'JScrollPane'" sollte "die gewünschte Wirkung (zumindest hat es für mich in der Vergangenheit) – MadProgrammer

+0

Ich wäre gespannt zu sehen Ihre endgültige Lösung. Bitte posten Sie im Forum. Ich habe noch nie einen Layout-Manager in einem JTextPanel gesehen. Wenn Sie einen Layout-Manager in einem JTextPane verwenden, frage ich mich, warum Sie überhaupt ein JTextPane verwenden. Scheint wie eine seltsame Lösung für mich. – camickr

+0

@MadProgrammer, Ich denke, ich bin auf dieser Frage zu Mittag essen. Ich verstehe die Antwort oder deinen Vorschlag nicht. Ich habe deinen Ansatz benutzt, um "in der Vergangenheit" zu "verhindern". Siehe [Kein Umbruchtext] (https://tips4java.wordpress.com/2009/01/25/no-wrap-text-pane/). Wenn ich meinen Vorschlag (der umschließt) verwenden und dann Ihren Vorschlag hinzufügen, gibt es kein Wrapping. – camickr