Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen

CptK

Bekanntes Mitglied
Hallo zusammen, ich habe mich in letzter Zeit recht viel mit GUI-Programmierung beschäftigt, habe aber das Gefühl, dass mein Code nicht optimal ist. Ich habe jetzt zum Beispiel eine Klasse, abgeleitet von JPanel, die im Endeffekt eine Liste von Komponenten enthält. Das Ganze sieht so aus:
1614541174813.png
Darüber gibt es noch einen Button (der aber nicht zu der Klasse selbst gehört) mit dem man eine weitere Zeile hinzufügt. Der Mülleimer ist denke ich klar.

Jetzt wo das erwartete Ergebnis hoffentlich klar ist der Code:
Java:
public class LabelCombinationInput extends JPanel {

    private static final long serialVersionUID = 4125516955764108160L;

    private List<LabelCombinationInputField> labelCombinationInputFields;

    private GridBagLayout layout;
    private GridBagConstraints gbc;

    private JDialog parent;

    private JPanel container;
    private GridBagLayout containerLayout;


    public LabelCombinationInput(JDialog parent) {
        this.parent = parent;

        labelCombinationInputFields = new ArrayList<>();
        LabelCombinationInputField defaultComb = new LabelCombinationInputField(this);
        defaultComb.setDefault("default");
        labelCombinationInputFields.add(defaultComb);

        layout = new GridBagLayout();
        setLayout(layout);

        container = new JPanel();
        containerLayout = new GridBagLayout();
        container.setLayout(containerLayout);

        // Load default
        for (LabelCombinationInputField input : labelCombinationInputFields) {
            gbc = makegbc(0, container.getComponentCount(), 1, 1, GridBagConstraints.CENTER, new Insets(10, 0, 0, 0),
                    10, 0, GridBagConstraints.HORIZONTAL);
            containerLayout.addLayoutComponent(input, gbc);
            container.add(input);
        }

        gbc = makegbc(0, getComponentCount(), 1, 1, GridBagConstraints.PAGE_START, new Insets(10, 0, 0, 0), 10, 0,
                GridBagConstraints.HORIZONTAL);
        layout.addLayoutComponent(container, gbc);

        add(container);

        setVisible(true);
    }

    public void addLabelCombinationInputField() {
        LabelCombinationInputField newInput = new LabelCombinationInputField(this);
        labelCombinationInputFields.add(newInput);
        gbc = makegbc(0, container.getComponentCount(), 1, 1, GridBagConstraints.CENTER, new Insets(10, 0, 0, 0), 10, 0,
                GridBagConstraints.HORIZONTAL);
        containerLayout.addLayoutComponent(newInput, gbc);
        container.add(newInput);

        parent.pack();
        container.revalidate();
        validate();
    }

    public void removeLabelCombinationInputField(LabelCombinationInputField field) {
        try {
            containerLayout.removeLayoutComponent(field);
            container.remove(field);
            validate();
            parent.pack();
        } catch (Exception e) {
            throw new NullPointerException("Cannot remove Component.");
        }
    }

}

mit der makegbc-Methode habe ich schon ein bisschen was ausgelagert, bin mir aber sicher, dass man den Code, vor allem die beiden Methoden "addLabelCombinationInputField" und "removeLabelCombinationInputField" noch optimieren kann, nur wie ist mir nicht bewusst. Außerdem würde ich diese Liste gerne scrollbar machen, sobald sie mehr als 6 Elemente beinhaltet, sodass das Fenster nicht immer größer wird.

Ich würde mich freuen, wenn ich da ein paar Hinweise bekommen könnte.
 

CptK

Bekanntes Mitglied
JScrollPane ist die Komponente dafuer.
Ich habe das jetzt wie folgt versucht:
Java:
JScrollPane pane = new JScrollPane(container, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
pane.setBorder(null);
add(pane);
Dadurch, dass nach jedem einfügen eines Elements die Methode pack() aufgerufen wird, um das Layout umzusetzen, wird irgendwann, wenn kein Platz mehr ist, einfach das Fenster vergrößert. Ich habe versucht, das mit pane.setPreferredSize(new Dimension(400, 200)); zu lösen, Problem hier: wenn, wie am Anfang nur ein Element in dem ScrollPane ist, wird das so hässlich in der MItte angezeigt. Was ich gerne hätte ist, dass sich diese Scrollpane bis zu einer Anzahl von beispielsweise 6 Elementen vergrößert und wenn diese Grenze überschritten wird, das scrollen greift. Leider weiß ich nicht, wie ich sowas umsetzen kann.
Wenn ich versuche eine maximale Größe hinzuzufügen pane.setMaximumSize(new Dimension(400, 200)); dann wird das einfach ignoriert, vermutlich wegen dem pack().
 

Robert Zenz

Top Contributor
Es ist moeglich dass das Layout das Problem ist, weil es die Komponenten einfach auf ihre bervorzugte Groesze wachsen laesst. Ich weisz dass, zum Beispiel, bei einem BorderLayout im Center das Problem nicht ist.
 

mihe7

Top Contributor
@UnknownInnocent, Du meinst sowas in der Richtung?
Java:
import java.awt.*;
import javax.swing.*;

public class Test {

    int counter;

    public void run() {
        JPanel content = new JPanel(new GridBagLayout());
        JPanel inner = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weighty=1;
        gbc.weightx=1;
        gbc.anchor=GridBagConstraints.PAGE_START;
        content.add(inner, gbc);

        gbc.anchor=GridBagConstraints.CENTER;

        JButton addRow = new JButton("+");
        addRow.addActionListener(e -> {            
            JLabel label = new JLabel("" + counter);
            gbc.gridx = 0;
            gbc.gridy = counter;
            inner.add(label, gbc);
            inner.revalidate();
            counter++;
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(addRow, BorderLayout.NORTH);
        frame.add(new JScrollPane(content));
        frame.setSize(300, 100);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 

CptK

Bekanntes Mitglied
@UnknownInnocent, Du meinst sowas in der Richtung?
Java:
import java.awt.*;
import javax.swing.*;

public class Test {

    int counter;

    public void run() {
        JPanel content = new JPanel(new GridBagLayout());
        JPanel inner = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weighty=1;
        gbc.weightx=1;
        gbc.anchor=GridBagConstraints.PAGE_START;
        content.add(inner, gbc);

        gbc.anchor=GridBagConstraints.CENTER;

        JButton addRow = new JButton("+");
        addRow.addActionListener(e -> {           
            JLabel label = new JLabel("" + counter);
            gbc.gridx = 0;
            gbc.gridy = counter;
            inner.add(label, gbc);
            inner.revalidate();
            counter++;
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(addRow, BorderLayout.NORTH);
        frame.add(new JScrollPane(content));
        frame.setSize(300, 100);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
Genau, so was in der Art nur kriege ich das halt nicht auf meine Bedürfnisse angepasst
 

CptK

Bekanntes Mitglied
Wenn ich aber auf das Jdialog Fenster nicht pack() aufrufe, nachdem ich eine neue Komponente hinzugefügt habe bekomm ich folgendes Ergebnis:
1615043244921.png
das ja eigentlich so aussehen sollte (bis auf die hier fehlende Scrollbar):
1615043172303.png
 

mihe7

Top Contributor
Doch, das soll ja so sein: JDialog -> JScrollPane -> äußeres Panel -> inneres Panel.

Beim Öffnen des Dialogfensters sollte dieses durch die JScrollPane eine gewisse Größe bekommen. Das revalidate() auf dem inneren Panel sorgt dafür, dass das Layout der Container bis zum validation root (das dürfte der Viewport sein) hinauf neu validiert wird, um die neuen Komponenten und deren Auswirkungen zu berücksichtigen.

Pack den Code mal in ein kompilierbares und ausführbares Minimalbeispiel (das ohne das Mülltonnen-Icon auskommt), dann können wir das Problem besser nachvollziehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
comp_math Code snippets AWT, Swing, JavaFX & SWT 3
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Kann man den Code umschreiben? AWT, Swing, JavaFX & SWT 8
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S ActionEvent Press Enter per Code auslösen AWT, Swing, JavaFX & SWT 22
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T JavaFX Falscher Wert getLayoutBounds? + Tipps zum Code-Aufbau? AWT, Swing, JavaFX & SWT 8
S JavaFX JavaScript Code in WebView/WebEngine AWT, Swing, JavaFX & SWT 0
L JavaFX GUI mit JavaFX. Scene Builder source code? AWT, Swing, JavaFX & SWT 6
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Ernesto95 JavaFX FXML vs. Java Code AWT, Swing, JavaFX & SWT 3
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
T Tab per Code wechseln? AWT, Swing, JavaFX & SWT 3
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
N JOGL-Code != C OpenGL-Code? AWT, Swing, JavaFX & SWT 9
R Source-Code, Javadoc AWT, Swing, JavaFX & SWT 16
S NetBeans GUI Builder - Code-Platzierung AWT, Swing, JavaFX & SWT 3
J Sauberer Gui-Code? AWT, Swing, JavaFX & SWT 22
B Color String Code AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
T Bei Klick Code ausführen AWT, Swing, JavaFX & SWT 17
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
A Applet Applet aus Code neu starten AWT, Swing, JavaFX & SWT 2
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
M JFileChooser setCurrentDirectory() - Verzeichnis relativ zum Code/binary AWT, Swing, JavaFX & SWT 14
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Warum funktioniert dieser Code ? (GUI) AWT, Swing, JavaFX & SWT 9
M ActionListener mit code!!! auslösen AWT, Swing, JavaFX & SWT 3
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
K Swing GUI code tutorials? AWT, Swing, JavaFX & SWT 5
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
G Code Blöcke AWT, Swing, JavaFX & SWT 6
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
O Source Code für "javax.swing.JLabel" ? AWT, Swing, JavaFX & SWT 2
T Öffnen von SWT-Dialogboxen durch HTML-Link in HTML-Code AWT, Swing, JavaFX & SWT 4
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
R Sun tutorial code von jcombobox mit image im combobox fehlt! AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Optik trotz gleicher Look and Feel Code? AWT, Swing, JavaFX & SWT 11
M Code umbauen ? AWT, Swing, JavaFX & SWT 7
C GUI passt sich nicht dem Code an! AWT, Swing, JavaFX & SWT 4
7 Latex/MathML Code in JTextPane AWT, Swing, JavaFX & SWT 2
B Code Architektur verbessern. AWT, Swing, JavaFX & SWT 4
R Syntax Highlighting von Java-Code AWT, Swing, JavaFX & SWT 2
O Swing Event / in GUI oder im Code ausgelöst ? AWT, Swing, JavaFX & SWT 2
J eventhandling / Problemmeldung Bitte schaut euch den Code an AWT, Swing, JavaFX & SWT 2
M Code Schloss AWT, Swing, JavaFX & SWT 11
C wysiwyg Editor zum Einbinden in meinem Code AWT, Swing, JavaFX & SWT 14
m@nu JComboBox & ItemListener: per Code 1. Item wählen AWT, Swing, JavaFX & SWT 2
M Mit JTextPane erstelltes Dokument als HTML-Code ausgeben AWT, Swing, JavaFX & SWT 4
H Code nach dem schließen eines Fensters ausführen? AWT, Swing, JavaFX & SWT 3
M Was halter iht von diesem Code? AWT, Swing, JavaFX & SWT 7
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben