AWT/Swing - Java ignoriert setSize() und setLocation()

Technikfreund

Banned
Dabei seit
Okt. 2018
Beiträge
152
Ich mache gerade meine ersten Gehversuche mit Swing und AWT. Ich las, dass man die Position und Größe der Elemente mit Methoden bestimmen kann. Ich versuche nun, mithilfe der Methoden das Layout zu gestalten, ohne den Weg über Layoutklassen zu gehen.

Das scheint aber nicht zu funktionieren. Java stellt den Löschknopf zentriert dar und legt auf meine Wunschvorstellungen einen großen Haufen. Wie kommt es zu diesem Verhalten? Was muss ich ändern, damit
Code:
setSize()
und
Code:
setPosition()
wie gewünscht funktionieren?

Eine Programmbeschreibung ist dem Anfangskommentar des Quelltextes zu entnehmen.

Code:
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JList;

/*
In dieser Anwendung gibt es eine Auswahlliste, dessen gesamter Inhalt über den
Löschknopf gelöscht werden kann, und zu dessen Liste aber auch über ein
Eingabefeld und einem Hinzufügeknopf ein Eintrag  hinzugefügt werden kann.
*/

public class ListFrame extends JFrame {
    private Container container;

    public ListFrame() {
        // Liste erzeugen
        String[] data = {"eins", "zwei", "drei", "vier"};
        JList<String> list = new JList<>(data);
        list.setLocation(10, 10);
        list.setSize(200, 200);

        // Löschknopf
        JButton deleteButton = new JButton("Delete");
        deleteButton.setLocation(210, 10);
        deleteButton.setSize(50, 20);

        // Eingabefeld
        JTextField textField = new JTextField();
        textField.setLocation(10, 220);
        textField.setSize(100, 20);

        // Hinzufügeknopf
        JButton inputButton = new JButton("Input");
        inputButton.setLocation(220, 220);
        inputButton.setSize(50, 20);

        // Basiscontainer ansprechen und alle Elemente hinzufügen
        container = getContentPane();
        container.add(list);
        container.add(deleteButton);
        container.add(textField);
        container.add(inputButton);
    }

    public static void main(String[] args) {
        ListFrame frame = new ListFrame();
        frame.setTitle("List");
        frame.setSize(800, 600);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
 

umask007

Ensign
Dabei seit
Dez. 2012
Beiträge
193

uburoi

Lieutenant
Dabei seit
Aug. 2008
Beiträge
801
Bin gerade nicht am Rechner, aber müsste am Ende des Konstruktors nicht "setVisible(true)" stehen, um den JFrame anzuzeigen?

Gruß Jens

EDIT: Sehe gerade, dass es in der main-Methode steht. Kenne ich so nicht...
 

Rossie

Commodore
Dabei seit
Dez. 2010
Beiträge
4.153
Ich versuche nun, mithilfe der Methoden das Layout zu gestalten, ohne den Weg über Layoutklassen zu gehen.
Ich kann davon nur abraten. Abseits von einigen seltenen Anwendungsfällen, sind LayoutManager das Mittel der Wahl!


Das scheint aber nicht zu funktionieren. Java stellt den Löschknopf zentriert dar und legt auf meine Wunschvorstellungen einen großen Haufen. Wie kommt es zu diesem Verhalten? Was muss ich ändern, damit setSize() und setPosition() wie gewünscht funktionieren?

Im Container den Standard LayoutManager entfernen:

Code:
.setLayout(null)

Die Widgets dem Container hinzufügen und dann mit

Code:
.setBounds(x, y, width, height)

Position und Größe für jedes Widget festlegen.

Aber wie gesagt, wenn Du es richtig machen möchtest, nutze LayoutManager!
 

Technikfreund

Banned
Ersteller dieses Themas
Dabei seit
Okt. 2018
Beiträge
152
Vielen Dank an Rossie! Ich habe das mal (erfolgreich) ausprobiert. Ich ahne schon, wo später die Probleme auftauchen könnten. Das sollte aber eh nur eine Übung sein. Einfach, damit mans mal gemacht hat. Ganz großen Dank!

Code:
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JList;

/*
In dieser Anwendung gibt es eine Auswahlliste, dessen gesamter Inhalt über den
Löschknopf gelöscht werden kann, und zu dessen Liste aber auch über ein
Eingabefeld und einem Hinzufügeknopf ein Eintrag  hinzugefügt werden kann.
*/

public class ListFrame extends JFrame {
private Container container;
public ListFrame() {
// Liste erzeugen
String[] data = {"eins", "zwei", "drei", "vier"};
JList<String> list = new JList<>(data);
list.setBounds(10, 10, 330, 100);
// Löschknopf
JButton deleteButton = new JButton("Delete");
deleteButton.setBounds(350, 10, 150, 30);
// Eingabefeld
JTextField textField = new JTextField();
textField.setBounds(10, 120, 200, 30);
// Hinzufügeknopf
JButton inputButton = new JButton("Input");
inputButton.setBounds(220, 120, 120, 30);
// Basiscontainer ansprechen und alle Elemente hinzufügen
container = getContentPane();
container.setLayout(null);
container.add(list);
container.add(deleteButton);
container.add(textField);
container.add(inputButton);
}
public static void main(String[] args) {
ListFrame frame = new ListFrame();
frame.setTitle("List");
frame.setSize(510, 190);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
(Leider funktionieren die Einrückungen hier nicht, des Texteingabefeld kann wohl die Tabs nicht verarbeiten. Zum nochmaligen korrigieren bin ich jetzt aber zu faul).
 
Top