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

Technikfreund

Banned
Registriert
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);
    }
}
 
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...
 
Technikfreund schrieb:
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!


Technikfreund schrieb:
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!
 
  • Gefällt mir
Reaktionen: Technikfreund
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).
 

Ähnliche Themen

Zurück
Oben