JButton trotz Box-Layout skalieren

Sloth

Mitglied
Hi,
dass ist mein erster Post hier im Forum und ich habe auch schon mein erstes Problem:

Ich will einen Vokabeltrainer programmieren und hänge schon direkt bei meinem Menü. Das Menü wird durch mehrer Buttons dargestellt, welche im Box-Layout untereinander ausgerichtet sind. Nun sind alle Buttons verschieden groß und ich hätte gerne eine "Einheitsgröße". Weil ich mich ein bisschen schlau gemacht habe, weiß ich schonmal, dass man von Komponenten, die mit einem Layoutmanager ausgerichtet wurden, nicht einfach die Größe verändern kann.
Ich würde aber dennoch gerne wissen, ob ich es irgendwie schaffen kann, dass alle Buttons gleich groß sind.

Hier ist mein Quellcode:
Java:
package vokabeltrainer;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author fabian
 */
public class Main extends JFrame implements ActionListener {

    private JPanel header;
    private Box box;

    private JButton btnInput;
    private JButton btnLearn;
    private JButton btnExit;

    public Main(String title) {
        setTitle(title);
        setSize(450, 300);
        setLocation(100, 100);
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        header = new JPanel();
        header.setLayout(new FlowLayout());
        header.add(new JLabel("Fabians Vokabeltrainer"));
        
        box = Box.createVerticalBox();

        btnInput = new JButton("Vokabeln eigeben");
        btnLearn = new JButton("Vokabeln lernen");
        btnExit = new JButton("Programm beenden");

        btnExit.setActionCommand("exit");
        btnExit.addActionListener(this);

        btnInput.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnLearn.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnExit.setAlignmentX(Component.CENTER_ALIGNMENT);

        btnInput.setPreferredSize(new Dimension(75, 45));
        btnLearn.setPreferredSize(new Dimension(75, 45));
        btnExit.setPreferredSize(new Dimension(75, 45));

        box.add(btnInput);
        box.add(btnLearn);
        box.add(btnExit);

        add(BorderLayout.NORTH, header);
        add(BorderLayout.CENTER, box);


        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        String label;

        label = e.getActionCommand();

        if(label.equals("exit")) {
            System.exit(0);
        }
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Main app = new Main("Vokabeltrainer - Menü");
    }

}

Und so sieht mein Fenster aus:
screenaj.jpg


Ich hoffe ihr könnt mir helfen.
Ich freue mich auf eure Antworten.

LG
Fabian alias Sloth

PS: Ich freue mich auch über Verbesserungsvorschläge zum Code
 
Hallo,

für dein Vorhaben ist das GridBagLayout, denke ich, besser geeignet. Er ist ein vielseitig einsetzbarer Layoutmanager, die Anfangsschwierigkeiten ist er wert. Du kannst dann mit GridBagConstraints.fill bestimmen, ob und wie die Zellen ausgefüllt werden sollen.

Was dein Codelayout betrifft:
Wäre es nicht schicker, die Funktionen der Buttons in einem Menu unterzubringen?
ActionListener würde ich als eigene Klassen implementieren, sie lassen sich so eventuell wiederverwenden und dein Code wird übersichtlichter.
Die des JPanels braucht keine Instanzvariable zu sein. Du solltest den GUI-Kram ohnehin in eine separate Klasse packen und in main steht dann nur sowas wie new GUI(), das sieht schick aus und ist wieder gut für die Übersichtlichkeit.
FlowLayout ist das default-Layout, brauchste nicht explizit einstellen (beim header).

Wie komplex soll denn dein Vokabeltrainer werden? Wenn du noch große Pläne damit hast, würde ich von Anfang an direkt eine eigene Datei für den GUI-Kram anlegen, also ein package aus deinem Projekt machen und Elemente, die du öfter verwenden wirst, in einer statischen Klasse verfügbar machen, vielleicht legst du dir sogar eine eigene lib in Form eines jar an, die du dann für weitere Projekte nutzen kannst.

Gruß n.

P.S.: was isn "eigeben"?
 
Zuletzt bearbeitet von einem Moderator:
Für eine statische Klasse halte ich z.B. ein Panel, das nebeneinander Buttons anordnen soll für sinnvoll. Generell jeden GUI-Kram, der nicht weiter referenziert werden wird.
 
Es hat geklappt. Danke sehr.
Mein Fenster sieht jetzt so aus:

screen02u.jpg


Ich habe die Lösung mit setMaximumSize ausprobiert, aber ich werde mir auch noch das GridBagLayout angucken.
 

Zurück
Oben