Das setzen der preferredSize beim JPanel wird nicht umgesetzt

Hallo Liebe Community,

ich beim setzen der PreferedSize eines JPanels ein paar Fragen. Und zwar erzeuge ich per Click auf einen Button neue Steuerelemente und setze diese auf besagtes JPanel. Das JPanel befindet sich in einem JScrollPanel da die Liste der Steuerelemente beliebig lang sein kann. Jetzt habe ich eine definierte Größe des JPanel sodass es auf die das JFrame passt, beim hinzufügen der Steuerlemente soll aber die beliebiglange Liste auch Scrollbar sein, also dacht ich mir das vergrößern des JPanel im JScrollPanel liefert mir gewünschtes Ergebnis, dem ist aber nicht so. Hier ein wenig Beispielcode:

        this.panel_jobsList.add(this.lbl_jobLabels.get(index));
        this.panel_jobsList.add(this.txt_jobNames.get(index));
        this.lbl_jobLabels.get(index).setBounds(20, this.y, 70, 20);
        this.txt_jobNames.get(index).setBounds(90, this.y, 350, 20);
        this.y += 30;
        System.out.println("Current index: " + index);
        if(index > 5) {
            System.out.println("Enter SizeMode.");
            // Resize JPanel
            this.panel_jobsList.setPreferredSize(new Dimension(this.panel_jobsList.getWidth(), this.panel_jobsList.getWidth() + 40));
        }

An der Stelle „// Resize JPanel“ vergrößere ich das JPanel um 40 Pixel in seiner Höhe um so alle Steuerlemente sichtbar auf dem JPanel zu haben und dass das JScrollPanel dann anfängt zu scrollen, leider regt sich nix und das JPanel behält seine Größe. Hoffe ihr könnt mir einen Gedankenanstoß geben?

Danke euch schonmal,

Gut Schuß
VuuRWerK :wink:

welches Layout verwendest du?
(das sieht sehr nach “Null” Layout aus)

wenn du das Null Layout hast dann musst du Size setzen nicht PreferredSize

sonst mach mal revalidate oder validate

Ja der Bequemlichkeithalber verwende ich beim automatischen Setzen von Steuerelementen immer das NULL-Layout, tut mir leid :slight_smile:

Das verwenden von validate oder revalidate hat leider kein Ergebnis gebracht, schade :frowning:

Ebenso das verwenden von setSize hat leider nicht den gewünschten Erfolg gebracht.

Liegt es vielleicht doch am NULL-Layout? Bei meiner bisherigen Verwendungen, beim automatischen Setzen von Steuerelementen, habe ich nie eine Liste von Steuerelementen gesetzt wo es auch zum scrollen kommen kann daher hat das NULL-Layout immer seinen Dienst getan.

Aber hier nochmal mein Zwischenstand, sollte jemand einen Vorschlag mit einem anderen LayoutManager haben würde ich mich sehr freuen.

        this.panel_jobsList.add(this.lbl_jobLabels.get(index));
        this.panel_jobsList.add(this.txt_jobNames.get(index));
        this.lbl_jobLabels.get(index).setBounds(20, this.y, 70, 20);
        this.txt_jobNames.get(index).setBounds(90, this.y, 350, 20);
        this.y += 30;
        System.out.println("Current index: " + index);
        if(index > 5) {
            System.out.println("Enter SizeMode.");
            this.panel_jobsList.setSize(new Dimension(this.panel_jobsList.getWidth(), this.panel_jobsList.getHeight() + 40));
            if((index % 2) == 0) {
                System.out.println("using revalidate().");
                this.panel_jobsList.revalidate();
            } else {
                System.out.println("using validate().");
                this.panel_jobsList.validate();
            }
        }

Das abwechselnde Nutzen von validate()/revalidate() habe ich nur gemacht um zu schauen ob eine der beiden Methoden eine Auswirkung hat.

Gut Schuß
VuuRWerK :wink:

P.S.: Im übrigen habe ich im obigen Code einen Schreibfehler, statt das 2.mal getWidth sollte es ein getHeight werden, aber daran hat es auch nicht gelegen :slight_smile:

nein das hat nichts mitm Null Layout zu tun das sollte eigentlich gehen.

Benutz aber niemals Null Layout nur wenn es absolut nötig ist und da du ja Listen und sowas hast solltest du es nicht benutzen weil kaum gibs nen anderes LnF ist alles im Arsch :wink:

Versuch’s mit einer JTable, das müsste passen :wink:

Das hab ich auch probiert hat mir dann aber nicht so zugesagt, dennoch danke :wink:

Ich habe es jetzt ganz anders gelöst: Ich habe eine JList genommen und diese wird dann mit beliebigvielen Einträgen gefüllt, die Einträge hol ich mir mit einem kleinen Dialog in dem dann der Wert eingetragen wird. Ich hab dafür extra eine ListModel-Klasse geschrieben, gegen das Interface ListModel implementiert, aber was da noch nicht so richtig will ist, dass trotz ständig neusetzen des Models in das JList wird die Liste anscheinend nicht mehr aktualisiert oder aber es wird nur 1 Eintrag angezeigt. Falls da noch jemand eine Idee haben sollte würde ich mich freuen aber vielleicht komm ich ja selber noch drauf :slight_smile:

Danke Euch erstmal,

Gut Schuß
VuuRWerK :wink:

nimm doch einfach DefaultListModel :wink:

Hi,

probier mal

this.panel_jobsList..setMinimumSize(Dimension);
this.panel_jobsList..setMaximumSize(Dimension);```

vor dem setPreferedSize

@Revenant, die Idee werde ich beim nächsten mal mit verwenden wenn ich wieder dynamisch Steuerelemente erzeuge, Danke!

Desweiteren habe ich, wie schon erwähnt, eine JList verwendet, da es ausschließlich zum anzeigen von Namen ging ich aber das bearbeiten der verschiedenen Namen erleichtern wollte. Nun muss der Nutzer halt einmal in die JList klicken um dann gewählten Namen zu bearbeiten, ja man bekommt nicht alles geschenkt :slight_smile:

Vielen Dank euch allen erstmal!

Gut Schuß
VuuRWerK :wink: