2017-04-12 2 views
1

hat eine setColumns Methode, um die maximale Anzahl der Spalten einzustellen, aber JTextPane nicht. Natürlich kann es verschiedene Schriftarten in einem einzigen Fenster haben, so dass die Festlegung der Anzahl der Spalten oder Zeilen nicht gerade sinnvoll ist. Wenn ich jedoch ein Dialogfeld mit einem JTextPane innerhalb einer JScrollPane und setText zu einer langen Zeichenfolge erstellen, wächst es auf die gesamte Breite des Bildschirms und eine einzelne Zeile, die ich verhindern möchte.Begrenzungsgröße eines JTextPane innerhalb eines JScrollPane

setMaximumSize scheint keine Wirkung zu haben und wird in keinem Fall empfohlen (siehe Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?).

+0

A JTextPane wird automatisch umbrochen, wenn die Leitungslänge größer als die Breite des Ansichtsfensters des scrollpane ist . Der Layout-Manager, den Sie verwenden, bestimmt die Größe des Bildlauffelds basierend auf dem verfügbaren Platz im Bild. Veröffentlichen Sie Ihr [mcve], das das Problem veranschaulicht. – camickr

+0

Überprüfen Sie dies: http://StackOverflow.com/Questions/39455573/How-to-set-fixed-width-but-dynamic-height-on-JTextpane/39466255#39466255 – Sharcoux

Antwort

2

Meine aktuelle Lösung, die ziemlich hässlich scheint, ist JTextPane zu erweitern, Code von JTextArea Implementierung borgen:

textArea = new JTextPane() { 
    int maxWidth; 
    int rowHeight; 

    void init(Font font) { 
     FontMetrics fontMetrics = getFontMetrics(font); 
     maxWidth = fontMetrics.charWidth('M') * 80; 
     rowHeight = fontMetrics.getHeight(); 
    } 

    { 
     initFont(getFont()); 
    } 

    @Override 
    public void setFont(Font font) { 
     init(font); 
     super.setFont(font); 
    } 

    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     Dimension base = super.getPreferredSize(); 
     Insets insets = getInsets(); 
     int width = Math.min(maxWidth, base.width) + insets.left + insets.right; 
     int estimatedRows = Math.max(1, (int) Math.ceil(base.getWidth()/maxWidth)); 
     int height = estimatedRows * rowHeight + insets.top + insets.bottom; 
      return new Dimension(width, height); 
    } 
}; 
+2

Ja, dies ist die geeignete Methode, um zu überschreiben, wenn Sie möchten eine bevorzugte Größe für die Bildlaufleiste vorschlagen. Dann kann der Layout-Manager diese Informationen verwenden. – camickr

Verwandte Themen