Hallöle,
eine Frage muss ich nochmal stellen.
Ich dachte eigentlich mit dem GridBagLayout gut klarzukommen, aber anscheinend muss ich da noch einige Kniffe lernen.
Folgendes. Ich habe vor ewiger Zeit mal ein Projekt gemacht wo links eine Ampel angezeigt wird und rechts drei Buttons sind.
Das hab ich mit dem bösen NullLayout gemacht und es sieht so aus:
Nun wollte ich das mit GridBagLayout bauen, unter anderem auch, damit ich die Fenstergröße anpassen kann.
Nach langem basteln ist das beste, was ich erreichen konnte das hier:
Der Quelltext wo das generiert wird sieht so aus:
private JFrame frame1 = new JFrame("Ampelschaltung");
private Canvas canvas = new Canvas() {
public void paint(Graphics stift) {
zeichne(stift);
}
};
private Button buttonautomatik = new Button();
private Button buttonwarnung = new Button();
private Button buttonweiter = new Button();
private int ampelstatus = 0;
private int warnstatus = 0;
private int modus = 0; //0=Nichts; 1=Normalschaltung, 2=Warnmodus
private Thread thread = null;
public Ampel() {
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setPreferredSize(new Dimension(400,400));
frame1.setMinimumSize(new Dimension(400,400)); //ANPASSEN
frame1.setResizable(true);
Container cp = frame1.getContentPane();
cp.setLayout(new GridBagLayout());
buttonautomatik.setLabel("Automatik ein");
buttonautomatik.setVisible(true);
buttonautomatik.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
buttonAutomatik_ActionPerformed();
}
});
buttonwarnung.setLabel("Warnmodus ein");
buttonwarnung.setVisible(true);
buttonwarnung.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
buttonWarnung_ActionPerformed();
}
});
buttonweiter.setLabel("Weiter schalten");
buttonweiter.setVisible(true);
buttonweiter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
buttonWeiter_ActionPerformed();
}
});
JPanel rechteflaeche = new JPanel();
rechteflaeche.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.VERTICAL;
c.weightx = 1;
c.gridy = 0;
rechteflaeche.add(buttonautomatik,c);
c.gridy = 1;
rechteflaeche.add(buttonwarnung,c);
c.gridy = 2;
rechteflaeche.add(buttonweiter,c);
frame1.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent evt) {
ampel_WindowClosed();
}
});
frame1.add(canvas,new GridBagFelder(0,0,1,1,0.65,1));
frame1.add(rechteflaeche,new GridBagFelder(1,0,1,1,0.35,1));
frame1.pack();
frame1.setLocationRelativeTo(null);
frame1.setVisible(true);
}
}```
Ich konnte mit `c.gridy = 0;` usw. schon mal erreichen, dass die drei Buttons untereinander angezeigt werden.
Jedoch wird beispielsweise vollkommen ignoriert, dass ich dem Canvas links 65% Breite zuordne und dem Rechts 35%.
Dazu ist zu sagen das hier `new GridBagFelder(0,0,1,1,0.65,1)` hab ich mir als Abkürzung angelegt, um nicht immer alle Constraints untereinander schreiben zu müssen.
So sieht der Konstruktor dazu aus:
```public class GridBagFelder extends GridBagConstraints {
public GridBagFelder(int x, int y, int width, int height, double weightX, double weightY) {
this.fill = GridBagConstraints.BOTH;
this.gridx = x;
this.gridy = y;
this.gridwidth = width;
this.gridheight = height;
this.weightx = weightX;
this.weighty = weightY;
}
}```
Nun geht meine Frage dahingehend, wie kann ich erreichen, dass das annähernd so aussieht wie auf dem ersten Bild?
Es wäre schön, wenn die Buttons sich oben rechts ausrichten und nicht so gigantisch viel Platz für nichts wegnehmen wie in dem Bild.
Wäre schön, wenn man mir ein paar Ideen geben könnte.
Vielen dank!
Lukas