2016-04-15 13 views
0

Dies wurde hier wahrscheinlich beantwortet, aber meine Suche zog eine leere, vielleicht für die falsche Sache, die ich bin auf der Suche.Wie kann ich verhindern, dass JTextArea und JTextField gedehnt werden?

Wie kann ich eine und eine JTextField von Stretching stoppen? Bietet swing einen Panel-Spacer irgendeiner Art, den ich hinzufügen kann, der vor allen anderen Elementen gestreckt wird?

Ich habe ein JPanel, die ein JFrame mit einer festgelegten Größe füllt. Es verwendet eine BoxLayout, die auf PAGE_AXIS festgelegt ist. Wenn ich eine mit der Größe 3,100 hinzufüge, ignoriert es diese Zeilen-/Spaltengrößen und füllt den gesamten verfügbaren Platz.

Ebenso habe ich eine JPanel mit einem GridLayout. Wenn ich eine JTextField an Stelle der Größe in den von mir angegebenen Spalten hinzufüge, wird der gesamte Platz im Raster ausgefüllt.

Edit: Die Zeichnung unten zeigt, was ich möchte (oben) und was ich bekommen. enter image description here

+0

Bitte senden Sie einige Stück Code, das Problem zu untersuchen. – Braj

+1

Beginnen Sie mit einem Blick auf [Layout Komponenten in einem Container] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) für einige weitere Details über die verschiedenen Layout-Manager, etwas wie 'FlowLayout' und' GridBagLayout' würden den Job erledigen – MadProgrammer

+0

Stellen Sie ASCII-Art oder eine einfache Zeichnung des * beabsichtigten * Layouts der GUI bei minimaler Größe zur Verfügung, und wenn sie veränderbar ist, mit mehr Breite und Höhe. –

Antwort

1

paar Worte direkt von Dokumentation zu How to Use GridLayout

A Gridlayout Objekt Orte Komponenten in einem Raster von Zellen. Jede Komponente nimmt den gesamten verfügbaren Platz innerhalb ihrer Zelle ein und jede Zelle hat genau die gleiche Größe. Wenn das GridLayoutDemo-Fenster in der Größe geändert wird, ändert das GridLayout-Objekt die Zellgröße, so dass die Zellen so groß wie möglich sind, angesichts des für den Container verfügbaren Speicherplatzes.

GridLayout berücksichtigt nicht die Größe der Komponente. Es versucht, die Komponente in verfügbarem Speicherplatz in Zeilen und Spalten anzupassen.


Versuchen Sie, die Größe explizit zu vermeiden. Es gibt eine sehr gute Post über Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?, die Ihnen helfen kann, es besser zu gestalten.


Es gibt viele Layout-Manager, die nach Ihren Anforderungen passen können. Bitte haben Sie einen Blick auf How to Use Various Layout Managers


Sie GridBagLayout statt GridLayout verwenden können, um die Komponenten in Zeilen und Spalten wie Tabellenlayout zu teilen, dass Sie mehr Kontrolle über Rasterweite gibt, Höhe, margin, padding, Spalte, Zeilen

usw.
+0

Danke für diese nützlichen Links. Der Grund, warum ich Größen spezifizieren möchte, ist, weil ich Eingabebeschränkungen habe (dh ich möchte maximal 8 Zeichen in diesem JTextView haben, weshalb ich es als 'neues JTextView (8)' ') in anderen UI Bibliotheken mit denen ich gearbeitet habe (Android/Qt) Sie können Abstandshalter oder leere Bereiche hinzufügen und die "Dehnungsfaktoren" dieser Komponenten festlegen, so dass es sich nicht (in diesem Fall) um den Textbereich/Bereich handelt, der den verfügbaren Platz ausfüllt. – Lieuwe

0

in meinem Code ich habe nur die Anzahl der Spalten

JTextField data = new JTextField(); 
data.setColumns(30); 
+0

* "Ich habe nur die Anzahl der Spalten festgelegt" * Die Frage erwähnt bereits, dies sowohl für den Textbereich als auch für das Feld zu tun. Das Problem hierbei ist, dass die ** Layouts ** die Komponenten auf den verfügbaren Platz ausdehnen. –

+0

Ich habe auch die MaxSize eingestellt –

0

Sie können nicht ernst Layouts GridLayout oder BoxLayout withe. Vergiss über sie.

Die erste Frage ist: Sind Sie sicher, dass Sie nicht möchten, dass die JTextArea und JTextField wachsen? Es ist ein Standard in UI, dass diese Komponenten wachsen und schrumpfen; der erste in beide Richtungen und der zweite horizontal.

Wie auch immer, ich poste Lösungen für GroupLayout und MigLayout, die sind die Manager, die ich sehr empfehlen.

a) Lösung mit GroupLayout

Jede Komponente hat drei Größen: Minimum, bevorzugt und Maximum. Diese sind auf einige sinnvolle Standardwerte für jede Komponente festgelegt. Deshalb neigt die JTextField dazu, horizontal zu wachsen; Der maximale Wert ist sehr große Zahl.

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class GroupLayoutStretchingEx extends JFrame { 

    public GroupLayoutStretchingEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(12, 20); 
     area.setBorder(BorderFactory.createEtchedBorder()); 
     JLabel input = new JLabel("Input"); 
     JTextField textField = new JTextField(15); 

     createLayout(area, input, textField); 

     setTitle("Stretching"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl); 

     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 

     gl.setHorizontalGroup(gl.createParallelGroup(GroupLayout.Alignment.TRAILING) 
       .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, 
         GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addGroup(gl.createSequentialGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2], GroupLayout.DEFAULT_SIZE, 
           GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, 
         GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addGroup(gl.createParallelGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2], GroupLayout.DEFAULT_SIZE, 
           GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) 
     ); 

     pack(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      GroupLayoutStretchingEx ex = new GroupLayoutStretchingEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

In GroupLayout, müssen Sie die richtigen Werte für die maximale Komponentengröße im addComponent() Verfahren einzustellen.

JTextArea area = new JTextArea(12, 20); 

Durch die Anzahl der Zeilen und Spalten für die JTextArea Einstellung wir eine preffered Größe für diese Komponente festgelegt. Dieser Wert wird später vom Layout-Manager in seinen Berechnungen verwendet.

b) Lösung mit MigLayout

In MigLayout steuern wir das resizement der Komponenten mit verschiedenen Constraints, wie fill, grow oder push. Wenn sie nicht verwendet werden, wachsen die Komponenten nicht.

package com.zetcode; 

import javax.swing.BorderFactory; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import net.miginfocom.swing.MigLayout; 

public class MigLayoutStretchingEx extends JFrame { 

    public MigLayoutStretchingEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(12, 20); 
     area.setBorder(BorderFactory.createEtchedBorder()); 
     JLabel input = new JLabel("Input"); 
     JTextField textField = new JTextField(15); 

     createLayout(area, input, textField); 

     setTitle("MigLayout example"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     setLayout(new MigLayout()); 

     add(arg[0], "wrap"); 
     add(arg[1], "split 2"); 
     add(arg[2], "growx"); 
     pack(); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      MigLayoutStretchingEx ex = new MigLayoutStretchingEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

Und hier ist der Screenshot:

Screenshot from the MigLayout example

Verwandte Themen