Java Swing - passender LayoutManager für Auswahlfenster

Robocopy

Cadet 4th Year
Registriert
Dez. 2021
Beiträge
96
Hallo Freunde. Ich möchte eine GUI mit Java Swing machen und habe aber kaum Erfahrung mit Swing. Ich habe aber mitbekommen dass GUIs mit LayoutManagern organisiert werden.
Mein Fenster soll folgendes beinhalten: Hauptsächlich eine Tabelle, die eine Art Auswahl symbolisiert, und unten zwei Buttons. Wenn die Größe des Fensters verändert wird, sollen sich die UI-Elemente entsprechend anpassen. Welcher LayoutManager ist da der passende?
 

Anhänge

  • testgrafik.png
    testgrafik.png
    3,9 KB · Aufrufe: 128
Mit einfachen Layout-Managern verwendet man oft mehrere verschachtelte Komponenten, um das gewünschte Verhalten zu erreichen. Hier könnte das ein Container mit einem GridLayout für die "Tabelle" und ein Container mit Flow-Layout für die Buttons sein, die in einem Container mit BorderLayout platziert werden. Gibt aber viele Möglichkeiten.

Leistungsfähiger, aber mit mehr Lernaufwand verbunden, ist MigLayout. Damit kann man solche Layouts auch ohne Verschachtelung umsetzen. Wenn man händisch viel mit Swing arbeitet, würde ich immer dazu greifen.
 
  • Gefällt mir
Reaktionen: Robocopy
ich würde von Swing abraten und das aktuellere JavaFX benutzen und da gibt es entsprechend aktuelle Software:
https://gluonhq.com/products/scene-builder/

Hier einZitat aus Wiki: "Hauptkonkurrent von Swing ist das für Eclipse entwickelte SWT. Der designierte Nachfolger von Swing ist das Framework JavaFX,"

Ich Empfehle das Layout im entsprechenden XML Format zu speichern (default in scene builder) und innerhalb deiner Java-Klassen die Annotaionen zu benutzen "@FXML"
 
  • Gefällt mir
Reaktionen: e_Lap
Das was Moritz sagt, ist korrekt. Angenommen du bleibst bei vanilla Java.
 
  • Gefällt mir
Reaktionen: Robocopy
Lustigerweise hat es JavaFX nie in die Runtime geschafft. Spielt heute aber keine wesentliche Rolle mehr, da man diese üblicherweise selbst mit ausliefert.
 
  • Gefällt mir
Reaktionen: Robocopy
Ich habe jetzt mal was gebaut auf Grundlage des Vorschlags von @Rossie
Das funktioniert so, wie ich mir das gewünscht habe, und auch auf Änderungen der Fenstergröße reagiert das Programm korrekt. Das ist ein Grund zur Freude.

Java:
import java.awt.*;
import javax.swing.*;

public class MainFrame extends JFrame {
    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.setTitle("Main Window");
        frame.setSize(400, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public MainFrame() {
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
        
        // Tabelle
        Container tableContainer = new Container();
        tableContainer.setLayout(new GridLayout(1, 1));
        String[] title = new String[]{
                "A", "B", "C", "D"
        };
        String[][] data = new String[][]{
                {"a", "b", "c", "d"},
                {"e", "f", "g", "h"},
                {"i", "j", "k", "l"}
        };
        tableContainer.add(new JScrollPane(new JTable(data, title)));
        
        // Buttons
        Container buttonContainer = new Container();
        buttonContainer.setLayout(new FlowLayout(FlowLayout.LEFT));
        buttonContainer.add(new JButton("Start"));
        buttonContainer.add(new JButton("Settings"));
        
        // Zusammenfügen
        contentPane.add(tableContainer, BorderLayout.CENTER);
        contentPane.add(buttonContainer, BorderLayout.SOUTH);
    }
}
 
Zurück
Oben