Swing , GridLayout, Größenbestimmung der Komponenten im Layout

HarryR

Mitglied
Hallo zusammen,

ich programmiere schon eine Weile Java-Programme und bin immer froh, wenn ich keine GUI benötige :)
Die Möglichkeiten eine GUI zu gestalten sind in swing mannigfaltig, aber es ist mir noch nie gelungen
eine zufriedenstellende Lösung zu implementieren.
Da ich ungern unzufrieden bin brauche ich eure Hilfe um dieses Thema engültig richtig zu verstehen und dann auch etwas ansprechendes hinzubekommen.
Genug der Vorrrede, gehen wir ins Detail.
Ich verwende gerne das GridLayout, wenn ich die einzelnen Komponenten vorausberechnen kann.
Nehmen wir als Beispiel eine Matrix aus 3x3 JLabel.
Diese wird initiiert und jedes Label bekommt eine voreingestelle Größe.
Zur Laufzeit bleibt die Höhe (height) immer gleich, die Breite (width soll sich aber ändern können).
Warum ?
Zur Laufzeit wird unterschiedlich langer Text mit setText gesetzt. Der gesamte Text (dessen Länge vorher nur größenordnungsmässig bekannt ist ,
also sowas wie "unter 50 Zeichen") soll sichtbar sein, also muss das JLabel breiter werden, wenn der Text neu gesetzt wird.
Ob sich dann die anderen JLabels ebenfalls in der Größe ändern wäre egal. Falls die Gesamtbreite der Matrix (bzw hier im Beispiel eine Zeile der Matrix)
sich ändert, auch egal, dann wird halt gescrollt.
Das klappt auch gut ..
Aber die automatische Änderung der JLabel gar nicht.
Hier mal ein Codeschnipsel, der demonstriert, was ich bisher versucht habe:

[CODE lang="java" title="Eine Zeile der Matrix"]final static int maxGap = 20;


private static Font myFont = new Font("SansSerif", Font.BOLD, 12);

GridLayout panelLayout = new GridLayout(0,columns+1);

JPanel line = new JPanel();

// Ich weiß vorher nicht, wie breit die Zeile wird, columns kann "fast" beliebig sein, daher wird hier einfach mal etwas gesetzt, was irgendwie passt
line.setSize(1000, 100);
line.setLayout(panelLayout);
line.setBorder(raisedetched);

// Eine spalte mehr, da ich noch eine Nummerirerung der Zeilen voranstelle
for (int i = 0;i<= columns;i++)
{
//Nummerierung
if (i == 0)
{
l = new JLabel(LText);
l.setBackground(Color.darkGray);
l.setForeground(Color.white);
}
else // variable Texte in den JLabel
// hier müsste eigentlich die Variabilität schon als Eigenschaft reiinkommen, aber wie ?
{
l = new JLabel(Integer.toString(i)); // Nur der "Init-Text, zur Laufzeit wird es länger"
l.setBackground(Color.gray);
}
l.setOpaque(true);
// irgendeien Schätzwert, der sich bewährt hat, empirisch ermittelt
l.setPreferredSize(new Dimension((int)(buttonSize.getWidth() )+maxGap,
(int)(buttonSize.getHeight()*0.5 )+maxGap));

l.setFont(myFont);
l.setBorder(blackline);
line.add(l);
}[/CODE]

So, zur Laufzeit passiert daann folgendes, ein String (nehemn wir an 20 Zeichen) soll via setText
gesetzt werden (klappt, da ich mir die JLabels in einem Array "merke" und dann einfach indiziert
auf das jeweilige JLabel zugreife.

Es passiert also nichts weiter ausser folgendes,
meine bisher untauglichen Versuche brauche ich nicht zu zeigen ...:

Java:
// das könnte das 3. oder letzte JLabel aus dem Code von "oben" sein.
label.setText("ein langer String der anzuzeigen ist");
// danach sollte das Label den gesamten Text anzeigen

Wie bekomme ich das so hin, dass sich die JLabel in der Breite anpassen,
(und das JPanel line dann notwendigerwese auch) ?

Ups, was nicht zu vergessen ist .. wo kommt die Matrix dann wie hin:
Der entsprechende Code wäre/ist ungefähr so:

Java:
public JPanel createLableLinePanel(int rows,int columns)
{
    JPanel taskViewer = new JPanel());
            
       taskViewer().setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    // ?
    //c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 0;
            
    for (int i=0;i<rows;i++)
    {
         // labelLine.createLabelLine ist im Grunde der Code von oben und erstellt ein JPanel aus columns JLabels
        // und ein wenig nicht swing-Brimborium
          taskViewer().add(i,labelLine.createLabelLine(columns,i,formatedInt(i+1,3,true)));           
       }
    return(taskViewer());
   }


Ich hoffe/denke, dass das für einige von euch trivial ist und ihr mir auf die Sprünge helft.

Viele Grüße und bleibt gesund
Harry
 

Neumi5694

Top Contributor
Du verwendest ein GridLayout, da wird die Breite der Spalten durch deren Anzahl bestimmt, nicht durch das, was darin ist.
Z.B. in einem GridbagLayout oder einem FlowLayout werden die Breiten automatisch angepasst, wenn du den Text änderst.

Keine Ahnung, was taskviewer() liefert oder welches Layout der verwendet.
 

Neumi5694

Top Contributor
ps:
Java:
l.setPreferredSize(...)
Ganz schlechte Idee, dies setzt jeden etwaigen Automatismus außer Kraft. Damit wird fix diese Größe verwendet, komme was wolle (es sei denn natürlich, das Ding hat keinen Platz im Container).
 

HarryR

Mitglied
Du verwendest ein GridLayout, da wird die Breite der Spalten durch deren Anzahl bestimmt, nicht durch das, was darin ist.
Z.B. in einem GridbagLayout oder einem FlowLayout werden die Breiten automatisch angepasst, wenn du den Text änderst.

Keine Ahnung, was taskviewer() liefert oder welches Layout der verwendet.
Okay, ich nehme mal das GridBagLayout (was mir aber auch Problemem bereitet, aber as wird ein andere Thread)
 

HarryR

Mitglied
ps:
Java:
l.setPreferredSize(...)
Ganz schlechte Idee, dies setzt jeden etwaigen Automatismus außer Kraft. Damit wird fix diese Größe verwendet, komme was wolle (es sei denn natürlich, das Ding hat keinen Platz im Container).
Also einfach weglassen ?
Das Layout wird nicht immer neu berechnet. Dazu müsstest Du ein (re)validate() auf dem Panel aufrufen.
okay, das bekomme ich hin ..
 

Neumi5694

Top Contributor
Mit setPreferredSize setzt du manuell eine Größe, das braucht man im Normalfall wirklich nur dann, wenn der Layoutmanager versagt oder bestimmte Komponenten immer gleich groß bleiben müssen, auch wenn dann nicht der ganze Text angezeigt wird.

Vielleicht solltest du mal den kompletten Formularcode posten, mir ist nicht ganz klar, wie und wo die Komponente mit dem Gridlayout eingebettet ist, das Problem kann ja auch dort zu suchen sein.
 

mihe7

Top Contributor
Mal ein kleines Beispiel mit GridLayout:
Java:
import java.awt.*;
import javax.swing.*;

public class Test {
    public void run() {
        JPanel inner = new JPanel(new GridLayout(0,3));

        JLabel[] labels = new JLabel[9];
        for (int i = 0; i < labels.length; i++) {
            labels[i] = new JLabel("Label #" + (i+1));
            inner.add(labels[i]);
        }

        JTextField tf = new JTextField(30);
        JButton button = new JButton("OK");
        button.addActionListener(e -> {
            labels[0].setText(tf.getText());
            inner.revalidate();
        });

        JPanel input = new JPanel();
        input.add(tf);
        input.add(button);

        JPanel outer = new JPanel(new BorderLayout());        
        outer.add(input, BorderLayout.NORTH);
        outer.add(inner, BorderLayout.SOUTH);

        JPanel container = new JPanel(new BorderLayout());
        container.add(outer, BorderLayout.NORTH);
    
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(container));
        frame.setSize(450, 300);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
T Swing Kompatibilitätsproblem zwischen Swing und JavaFX AWT, Swing, JavaFX & SWT 4
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
S (Swing)Vollbild anzeigen unter Linux/Mac AWT, Swing, JavaFX & SWT 6
Seikuassi SWING - (Hoffentlicher) simpler Color-Fehler AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben