2016-04-23 18 views
0

Ich habe mehrere s innerhalb einer JPanel. Ich verwende eine BoxLayout, um sie vertikal auszurichten und die Breite des Containers zu füllen.Höhe einstellen aber nicht Breite von JTextArea

Es funktioniert, aber sie scheinen zu erweitern, um die gesamte Höhe als auch zu füllen.

Was ich wirklich will, ist einfach - ein Textbereich, der Text umschließt, wo ich die Breite steuern kann, aber die Höhe dynamisch skalieren kann, wenn mehr Zeilen hinzugefügt werden. Die obige Methode war nur mein bester Versuch. Wenn es eine Lösung gibt, die einen anderen Layout-Manager, eine andere Textkomponente usw. verwendet, funktioniert das.

minimal nachprüfbares Beispiel unten:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setPreferredSize(new Dimension(300, 300)); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel textAreas = new JPanel(); 
    textAreas.setLayout(new BoxLayout(textAreas, BoxLayout.Y_AXIS)); 

    JTextArea area1 = new JTextArea(); 
    area1.append("this is a string"); 
    area1.setLineWrap(true); 
    area1.setWrapStyleWord(true); 
    textAreas.add(area1); 

    JTextArea area2 = new JTextArea("and another that is much longer, so that it wraps to the next line"); 
    area2.setLineWrap(true); 
    area2.setWrapStyleWord(true); 
    textAreas.add(area2); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setViewportView(textAreas); 

    frame.add(scrollPane); 
    frame.pack(); 
    frame.setVisible(true); 
} 

Ich habe auf meinem eigenen zu diesem Thema recherchiert, auch bei unterschiedlichem Layout-Manager sucht (http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) und andere Fragen auf der Website überprüft, aber ich habe nicht hatte viel Glück.

TLDR: Kann ich es so machen, dass jedes Element eines Layouts eine Höhe hat, die auf seinen Inhalt skaliert, aber eine feste Breite? Wenn das so ist, wie?

Antwort

2

Was ich wirklich möchte, ist einfach - ein Textbereich, der Text umschließt, wo ich die Breite steuern kann, aber die Höhe dynamisch skalieren kann, wenn mehr Zeilen hinzugefügt werden.

Das BoxLayout respektiert die maximale Größe, so dass der Textbereich den gesamten verfügbaren Platz im Panel ausfüllt. Sie können die getMaximumSize() Methode überschreiben, um die bevorzugte Höhe zurückzubringen, indem mit so etwas wie:

JTextArea area1 = new JTextArea() 
{ 
    public Dimension getMaximumSize() 
    { 
     Dimension d = super.getMaximumSize(); 
     d.height = getPreferredSize().height; 

     return d; 
    } 
}; 

Es funktioniert ...

Nicht wirklich. Machen Sie den Rahmen breiter und der Text wird ausgepackt. Dann verkleinern Sie den Rahmen und die Bildlaufleiste wird angezeigt. Das ist der Text wird nicht erneut umbrochen

Was Sie tun müssen, ist erzwingen, dass das Panel, das dem Bildlauffenster hinzugefügt wird, dieselbe Breite wie das Ansichtsfenster hat. Dadurch wird das Einwickeln richtig funktionieren.

Sie tun dies, indem Sie die Schnittstelle Scrollable auf dem Panel implementieren. Insbesondere müssen Sie die Methode getScrollableTracksViewportWidth() überschreiben, um true zurückzugeben.

Oder eine einfachere Lösung ist die Verwendung der Scrollable Panel Klasse, mit der Sie Eigenschaften des Panels festlegen können, um dieses Verhalten zu steuern.

Sie können eine JPanel mit der ersetzen ScrollablePanel:

//JPanel textAreas = new JPanel(); 
ScrollablePanel textAreas = new ScrollablePanel(); 
textAreas.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 

Edit:

Wenn es eine Lösung ist, die ein anderes Layout-Manager

Ohne das Überschreiben der getMaximumSize() Methode verwendet der Textbereiche und bei der Verwendung der Scrollable Panel sollten Sie in der Lage sein um die folgenden Layout-Manager zu verwenden.

Mit GridBagLayout können Sie die Einschränkung "weightx" angeben. Dadurch kann die Komponente den gesamten verfügbaren Platz im Panel ausfüllen.

Oder wenn Sie nicht möchten, dass alle Einschränkungen des GridBagLayout angegeben werden, können Sie die Relative Layout verwenden, die vertikale/horizontale Layout von Komponenten in ihrer bevorzugten Größe unterstützen.

Sie müßten nur die Kraftkomponente Folgendes verwenden, um den horizontalen Raum zu füllen:

//textAreas.setLayout(new BoxLayout(textAreas, BoxLayout.Y_AXIS)); 
RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS); 
rl.setFill(true); 
textAreas.setLayout(rl);