Hi zusammen,
ich sitze jetzt ohne Witz seit 8 Stunden an dieser frustrierenden Aufgabe. Ich gebe jetzt endgültig das rumprobieren, nachdenken und googlen auf und wende mich an euch, meine letzte Hoffnung. (Die mich noch nie entäuscht hat )
Also, kurz und knackig, ich muss eine simple GUI für einen Terminkalender schreiben, und dafür das JGridBagLayout verwenden. Ich beschreibe jetzt mal nur den konkreten Teil der Aufgabe, der mir bis jetzt Probleme bereitet.
Im oberen Teil des Anfangsfensters soll mittig der aktuelle Monat und das Jahr als JLabel stehen. Direkt rechts und links daneben jeweils ein JButton, um einen Monat vor- oder zurück zu springen.
In der Reihe darunter, ebenfalls mittig, ein "Wählen..."-button, um Tag und Monat manuell einzugeben (in einem Popup-Fenster, darum kümmer ich mich aber noch gar nicht).
Und dann direkt darunter eine JTable innerhalb einer JScrollPane. Die beiden Spalten der Tabelle heißen "Tag" und "Termine". Die Zeilenanzahl entspricht der Anzahl der Tage im Monat. Unter "Tag" steht der halt der Tag als Zahl, und unter "Termine" steht die Anzahl der Termine an dem Tag. Das ist soweit alles.
Was ich habe:
- Alle Elemente werden erzeugt und erscheinen im Fenster, in der richtigen Gitter-Zeile.
- Die Inhalte der Tabelle sind ohne Fehler.
Um eventhandler usw kümmere ich mich später noch.
Meine Probleme:
- Die Buttons und das Label mittig positionieren
- Die Größe der Tabelle verändern (sie ist standardmäßig viel zu groß, und die Größe ist statisch. Bei einem kleineren Fenster soll sie dieses bis zum Rand ausfüllen. Am besten sogar dynamisch an veränderungen vom Fensterrand anpassen, bzw nur die Breite.)
Mein Ausschnitt des Codes:
die GridBagConstraints habe ich vorerst absichtlich redundant aufgeschrieben, für jedes einzelne element, weil ich sonst den überblick verliere. Außerdem habe ich sie schon tausend mal verändert und alles mögliche ausprobiert was mir in den Sinn kam, deswegen ergeben die aktuellen Werte weniger Sinn als mein erster Versuch.
Ich dachte mir zuerst, ja cool ich kann im gitter einfach die x und y koordinate eintragen, und das element erscheint dann genau dort.
Aber dann kommt halt der layout manager und sagt "Ach, du willst es in der Mitte? Ne du, ich kleb die buttons mal lieber an den Rand, ist viel cooler so."
Alles klar Swing, Danke für nichts
Aber Danke an euch schonmal im Voraus
ich sitze jetzt ohne Witz seit 8 Stunden an dieser frustrierenden Aufgabe. Ich gebe jetzt endgültig das rumprobieren, nachdenken und googlen auf und wende mich an euch, meine letzte Hoffnung. (Die mich noch nie entäuscht hat )
Also, kurz und knackig, ich muss eine simple GUI für einen Terminkalender schreiben, und dafür das JGridBagLayout verwenden. Ich beschreibe jetzt mal nur den konkreten Teil der Aufgabe, der mir bis jetzt Probleme bereitet.
Im oberen Teil des Anfangsfensters soll mittig der aktuelle Monat und das Jahr als JLabel stehen. Direkt rechts und links daneben jeweils ein JButton, um einen Monat vor- oder zurück zu springen.
In der Reihe darunter, ebenfalls mittig, ein "Wählen..."-button, um Tag und Monat manuell einzugeben (in einem Popup-Fenster, darum kümmer ich mich aber noch gar nicht).
Und dann direkt darunter eine JTable innerhalb einer JScrollPane. Die beiden Spalten der Tabelle heißen "Tag" und "Termine". Die Zeilenanzahl entspricht der Anzahl der Tage im Monat. Unter "Tag" steht der halt der Tag als Zahl, und unter "Termine" steht die Anzahl der Termine an dem Tag. Das ist soweit alles.
Was ich habe:
- Alle Elemente werden erzeugt und erscheinen im Fenster, in der richtigen Gitter-Zeile.
- Die Inhalte der Tabelle sind ohne Fehler.
Um eventhandler usw kümmere ich mich später noch.
Meine Probleme:
- Die Buttons und das Label mittig positionieren
- Die Größe der Tabelle verändern (sie ist standardmäßig viel zu groß, und die Größe ist statisch. Bei einem kleineren Fenster soll sie dieses bis zum Rand ausfüllen. Am besten sogar dynamisch an veränderungen vom Fensterrand anpassen, bzw nur die Breite.)
Mein Ausschnitt des Codes:
Java:
import javax.swing.*;
import java.awt.*;
import java.time.LocalDate;
public class CalendarWindow extends JFrame {
byte monat = (byte) 1;//(LocalDate.now().getMonth().getValue() - 1);
short jahr = (short) 2099;//LocalDate.now().getYear();
public CalendarWindow(Appointments termine) {
setSize(400, 700); // x * y in Pixeln
setTitle("Kalender"); // Name des Fensters
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Programm mit Klick auf "X" terminieren
setLayout(new GridBagLayout());
// Benötigte Objekte erzeugen
Container contentPane = getContentPane(); // FRAGEN: Wofür brauche ich das? Funktioniert auch ohne.
JButton links = new JButton("<");
JLabel currentMonth = new JLabel(DateUtil.MONTH[monat] + " " + jahr);
JButton rechts = new JButton(">");
JButton waehlen = new JButton("Wählen...");
String[][] tableData = new String[DateUtil.daysOfMonth(monat, jahr)][2];
for (byte i = 0; i < DateUtil.daysOfMonth(monat, jahr); i++) {
tableData[i][0] = "" + (i + 1) + ".";
switch(termine.count(i, monat, jahr)){
case 0:
break;
case 1:
tableData[i][1] = "1 Termin";
break;
default:
tableData[i][1] = "" + termine.count(i, monat, jahr) + " Termine";
}
}
String[] columnNames = { "Tag", "Termine" };
JTable table = new JTable(tableData, columnNames);
JScrollPane hauptteil = new JScrollPane(table);
GridBagConstraints c = new GridBagConstraints(); // zum "navigieren" der Position
c.fill = GridBagConstraints.NONE; // Elemente waagerecht anordnen
// c.insets = new Insets(6, 6, 6, 6); // Abstände der Elemente voneinander
// Oberer Teil, Auswahl des Monats usw.
c.anchor = GridBagConstraints.EAST;
c.gridwidth = 2;
c.gridx = 2;
c.gridy = 1;
add(links, c);
c.anchor = GridBagConstraints.CENTER;
c.gridwidth = 2;
c.gridx = 3;
c.gridy = 1;
add(currentMonth, c);
// c.gridx = 3;
c.gridy = 2;
add(waehlen, c);
c.anchor = GridBagConstraints.WEST;
c.gridwidth = 2;
c.gridx = 4;
c.gridy = 1;
add(rechts, c);
// Tabelle
// c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.BASELINE;
c.gridx = 1;
c.gridy = 3;
c.gridwidth = 6;
add(hauptteil, c);
c.gridwidth = 1;
// pack();
setVisible(true);
}
}
die GridBagConstraints habe ich vorerst absichtlich redundant aufgeschrieben, für jedes einzelne element, weil ich sonst den überblick verliere. Außerdem habe ich sie schon tausend mal verändert und alles mögliche ausprobiert was mir in den Sinn kam, deswegen ergeben die aktuellen Werte weniger Sinn als mein erster Versuch.
Ich dachte mir zuerst, ja cool ich kann im gitter einfach die x und y koordinate eintragen, und das element erscheint dann genau dort.
Aber dann kommt halt der layout manager und sagt "Ach, du willst es in der Mitte? Ne du, ich kleb die buttons mal lieber an den Rand, ist viel cooler so."
Alles klar Swing, Danke für nichts
Aber Danke an euch schonmal im Voraus