LayoutManager GridLayout verschiebt sich

Lokilein

Mitglied
Hallo alle zusammen,

ich habe folgendes Problem: Ich möchte gerne einen Kalender schreiben und grundsätzlich funktioniert das auch schon ganz gut - zumindest wenn ich den Kalender das erste Mal aufrufe. Beim Wechsel des Monats oder des Jahres ändert sich aber mein GridLayout von 8 Spalten und 7 Zeilen in ein 7x7-Bereich. Ich habe es schon mit setVisible und pack() probiert, aber das hilft mir leider auch nicht. Beim Debuggen behauptet er aber weiterhin, dass sein layout 8 spalten hätte.

Hier mal der Quelltext, vielleicht weiß ja jemand, woran es liegt. Die entsprechende Methode ist
Code:
einzeichnenLabels()

Java:
public class Kalender extends javax.swing.JPanel 
{

    private JLabel[] tage = new JLabel[56];
    private int maxLabels = -1;
    private GridLayout gL = new GridLayout(7,8);
    /**
     * Creates new form Kalender
     */
    public Kalender() {
        initComponents();
        fuellenJahresauswahl();
        palTage.setLayout(gL);
        Calendar c = Calendar.getInstance();
        cboMonat.setSelectedIndex(c.get(Calendar.MONTH));
        cboJahr.setSelectedItem(String.valueOf(c.get(Calendar.YEAR)));
        fuellenKalender();
    }
    
    private void einzeichnenLabels()
    {
        palTage.setVisible(false);
        palTage.removeAll();
        palTage.setLayout(gL);
        palTage.setVisible(true);
        for(int i=0; i <= maxLabels; i++)
        {
            tage[i].setHorizontalAlignment(JLabel.CENTER);
            palTage.add(tage[i]);
        }
        palTage.setVisible(true);
    }
    
    private void fuellenJahresauswahl()
    {
        cboJahr.removeAllItems();
        for(int i = 1900; i < 2100; i++)
        {
            cboJahr.addItem(String.valueOf(i));
        }
    }
    
    private void fuellenKalender()
    {
        tage = new JLabel[56];
        fuellenUeberschriften();
        fuellenTage();
        einzeichnenLabels();
        palTage.repaint();
    }
    
    private void fuellenUeberschriften()
    {
        tage[0] = new JLabel("");
        tage[1] = new JLabel("Mo");
        tage[2] = new JLabel("Di");
        tage[3] = new JLabel("Mi");
        tage[4] = new JLabel("Do");
        tage[5] = new JLabel("Fr");
        tage[6] = new JLabel("Sa");
        tage[7] = new JLabel("So");
    }
    
    private void fuellenTage()
    {
        //Der erste des ausgewählten Monats
        Calendar c = Calendar.getInstance();
        c.set(Integer.parseInt(cboJahr.getSelectedItem().toString()), cboMonat.getSelectedIndex(), 1);
        c.get(Calendar.DATE); 
        c.get(Calendar.MONTH);
        c.get(Calendar.YEAR);
        
        int zaehler = 9; // der erste Tag im Monat, der eingetragen werden kann
        zaehler = zaehler + wochentag(c.get(Calendar.DAY_OF_WEEK));
        for(int i = 8; i <= 56; i++)
        {
            //Soll eine Woche eingetragen werden oder ein Tag?
            if(i % 8 == 0)
            {
                tage[i] = new JLabel(String.valueOf(c.get(Calendar.WEEK_OF_YEAR)));
            }else{
                if(i < zaehler)
                {
                    tage[i] = new JLabel("");
                }else{
                    tage[i] = new JLabel(String.valueOf(c.get(Calendar.DAY_OF_MONTH)));
                    c.add(Calendar.DAY_OF_MONTH, 1);
                }
            }
            //Wenn der Monat sich geändert hat, abbrechen
            if(c.get(Calendar.MONTH) != cboMonat.getSelectedIndex())
            {
                maxLabels = i;
                break;
            }
        }
    }
    
    private int wochentag(int dayOfWeek)
    {
        switch(dayOfWeek)
        {
            case Calendar.MONDAY   : return 0;
            case Calendar.TUESDAY  : return 1;  
            case Calendar.WEDNESDAY: return 2;
            case Calendar.THURSDAY : return 3;
            case Calendar.FRIDAY   : return 4;  
            case Calendar.SATURDAY : return 5;
            case Calendar.SUNDAY   : return 6;   
            default: return 0;
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        palAuswahl = new javax.swing.JPanel();
        cboMonat = new javax.swing.JComboBox();
        cboJahr = new javax.swing.JComboBox();
        palTage = new javax.swing.JPanel();

        setLayout(new java.awt.BorderLayout());

        palAuswahl.setPreferredSize(new java.awt.Dimension(526, 30));
        palAuswahl.setLayout(new java.awt.GridLayout(1, 2));

        cboMonat.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        cboMonat.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" }));
        cboMonat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cboMonatActionPerformed(evt);
            }
        });
        palAuswahl.add(cboMonat);

        cboJahr.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        cboJahr.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cboJahrActionPerformed(evt);
            }
        });
        palAuswahl.add(cboJahr);

        add(palAuswahl, java.awt.BorderLayout.PAGE_START);

        palTage.setLayout(new java.awt.GridLayout());
        add(palTage, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                        

    private void cboMonatActionPerformed(java.awt.event.ActionEvent evt) {                                         
        fuellenKalender();
    }                                        

    private void cboJahrActionPerformed(java.awt.event.ActionEvent evt) {                                        
        fuellenKalender();
    }                                       
                
    private javax.swing.JComboBox cboJahr;
    private javax.swing.JComboBox cboMonat;
    private javax.swing.JPanel palAuswahl;
    private javax.swing.JPanel palTage;              
}

(Ich habe die NetBeans-Swing-Oberfläche dafür genutzt)

Ich hoffe jemand kann mir dabei helfen

Mit freundlichen Grüßen
Svenja
 
I

IMartin

Gast
Liegt am nicht sofort verständlichen Verhalten des GridLayout bzw. daran, dass je nach Monat unterschiedlich viele JLabels hinzugefügt werden.

Eine Möglichkeit:
[JAVA=6]private GridLayout gL = new GridLayout(7,8);[/code]
ändern in:
[JAVA=6]private GridLayout gL = new GridLayout(0,8);[/code]
 

Lokilein

Mitglied
Danke für die Antwort. Leider hat das nicht geholfen. Das führt nun dazu, dass 9 Felder angezeigt werden: Die Überschriftenfelder (8) und die erste Kalenderwoche (1). Selbst das ist ja noch falsch: Hier sollten nur 8 angezeigt werden, oder?
Ich habe auch versucht, das Grid dynamisch beim hochzählen der Wochen zu erweitern, allerdings erfolglos.

Gibt es eine andere Möglichkeit?

lg
 
S

SlaterB

Gast
das Layout reagiert immer gleich, hättest du am Anfang einen anderen Startmonat, dann sieht es genauso aus,
nur der Juli weicht zufällig ab, September 2013 ist aber z.B. auch so

das Layout füllt lieber Reihen statt Spalten, wenn du nur 7 Einträge hättest, würden alle untereinander stehen, statt in der ersten Zeile nebeneinander,
die meisten Monate haben zuwenig Einträge, fülle z.B. am Ende mit leeren JLabel auf, dann gehts

testweise etwa
Java:
        while (maxLabels < 50) {
           maxLabels++;
           tage[maxLabels] = new JLabel("");
        }

auf setVisible(false/true) verzichte lieber, stattdessen reicht ein validate() vor dem repaint() nach Änderung der Komponenten,

--------

noch besser:
generell solltest du nicht ständig neue JLabel erzeugen, das ist für sich unschön, mit neuberechneten Layout umso mehr,
erstelle von Anfang an 7x8 JLabel, dann hättest du mit dem Layout überhaupt keine Probleme mehr nachdem es einmal funktioniert,
das obige inklusive meiner Schleife könnte wegfallen,

die Wochentage musst du auch nicht mehr ständig neu befüllen, nur die restlichen JLabel alle durcharbeiten,
mit setText() entweder neue Zahl oder Leerstring "" setzen,
setVisible, validate und repaint sind dann alle unnötig
 
Zuletzt bearbeitet von einem Moderator:
I

IMartin

Gast
Anmerkungen von SlaterB kann ich natürlich nur unterschreiben. Trotzdem würde mich interssieren, wie man in einem Container mit
Code:
GridLayout(0,8)
9 Spalten (ist vermutlich mit Feldern gemeint) angezeigt bekommt.
 

Lokilein

Mitglied
Vielen Dank euch beiden!

Die Kombination aus beidem machts. Wenn ich die Objekte zu Beginn alle bereits erstelle, funktioniert es auch nur, wenn man das layout auf (0,8) setzt. Bei (7,8) verwirft er es weiterhin.
Jetzt ist aber alles an der richtigen Stelle und so wie es sein soll. Ist aber auch an sich eine gute Idee, es so zu machen, ich werde den Quelltext jetzt nochmal überarbeiten, dass es noch etwas schicker wird

@IMartin: Was ich meinte, waren sozusagen zwei Reihen und 8 Spalten. Er hat die erste reihe richtig gemacht, bei der zweiten hat er nach dem 1. Feld aufgehört. Das wundert mich eigentlich, warum er da so halbe sachen macht...
 
I

IMartin

Gast
Aha, ok. Kann es zwar nicht nachstellen, aber solange es 8 Spalten sind, kann ich es verschmerzen ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E GridLayout auf ScrollPane AWT, Swing, JavaFX & SWT 4
thor_norsk GridLayout AWT, Swing, JavaFX & SWT 11
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
pkm kryptisches Verhalten bei GridLayout AWT, Swing, JavaFX & SWT 4
K Swing GridLayout - x und y bei Mausklick ausgeben AWT, Swing, JavaFX & SWT 4
S GridLayout SWT: Anordnung Composites nebeneinander AWT, Swing, JavaFX & SWT 2
B GridLayout - wie am besten implementieren AWT, Swing, JavaFX & SWT 3
B GridLayout Basics AWT, Swing, JavaFX & SWT 1
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
F JPanel "verschmelzen" GridLayout AWT, Swing, JavaFX & SWT 10
M LayoutManager GridLayout funktioniert nicht AWT, Swing, JavaFX & SWT 0
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
F Gridlayout AWT, Swing, JavaFX & SWT 6
A JPanel oder GridLayout Größe festsetzten AWT, Swing, JavaFX & SWT 4
X GridLayout JPanel austauschen AWT, Swing, JavaFX & SWT 2
A JFrame Größenänderung mit Maus und GridLayout AWT, Swing, JavaFX & SWT 10
J Button in GridLayout AWT, Swing, JavaFX & SWT 2
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
B GridLayout AWT, Swing, JavaFX & SWT 6
T Spaltengröße einzelner Spalten in Gridlayout festlegen AWT, Swing, JavaFX & SWT 3
Karuka Abstände im GridLayout ändern AWT, Swing, JavaFX & SWT 8
Karuka 2D-Grafik Bilder in GridLayout einfügen AWT, Swing, JavaFX & SWT 7
C Scollpane an dynamisches GridLayout anpassen? AWT, Swing, JavaFX & SWT 3
J Swing Bilder anzeigen in Gridlayout AWT, Swing, JavaFX & SWT 11
C Linien über GridLayout zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme mit Gridlayout AWT, Swing, JavaFX & SWT 4
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
Z Swing JButton erweitern/Gridlayout AWT, Swing, JavaFX & SWT 2
L Swing GridLayout AWT, Swing, JavaFX & SWT 4
lumo LayoutManager SWT GridLayout - Reihenfolge ändern AWT, Swing, JavaFX & SWT 7
C Swing GridLayout: Kann man die Spaltenbreiten variabel gestalten? AWT, Swing, JavaFX & SWT 4
J SWT Größe eines Composite mit Gridlayout festlegen AWT, Swing, JavaFX & SWT 2
Y Kein GantChart in einem GridLayout AWT, Swing, JavaFX & SWT 5
M Formular in GridLayout ? AWT, Swing, JavaFX & SWT 17
R LayoutManager Problem mit GridLayout AWT, Swing, JavaFX & SWT 5
F LayoutManager GridLayout 0/0 auf andere Ecke setzen AWT, Swing, JavaFX & SWT 4
Rudolf Swing Gridlayout und Grouper vorhanden? AWT, Swing, JavaFX & SWT 4
S SWT GridLayout scrollbar machen? AWT, Swing, JavaFX & SWT 7
A Gridlayout Vertikal anordnen AWT, Swing, JavaFX & SWT 6
D LayoutManager GridLayout, 2 labels nebeneinander AWT, Swing, JavaFX & SWT 8
B Swing GridLayout.add über 2 Spalten? AWT, Swing, JavaFX & SWT 7
R LayoutManager GridLayout verändert isch andauernd AWT, Swing, JavaFX & SWT 4
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
B GridLayout und scrollbar AWT, Swing, JavaFX & SWT 5
J Swing Bild in GridLayout AWT, Swing, JavaFX & SWT 8
aze GridLayout: Keine automatische Ausdehnung AWT, Swing, JavaFX & SWT 2
M SWT keine Scrollbar bei widgets.List und GridLayout AWT, Swing, JavaFX & SWT 2
M Image an Gridlayout anpassen AWT, Swing, JavaFX & SWT 5
E SWT Problem mit Gridlayout AWT, Swing, JavaFX & SWT 3
G SWT GridLayout AWT, Swing, JavaFX & SWT 2
lumo SWT GridLayout - clear? AWT, Swing, JavaFX & SWT 4
T GridLayout Zeilen Hintergrund AWT, Swing, JavaFX & SWT 5
N Gridlayout macht Probleme AWT, Swing, JavaFX & SWT 3
L GridLayout verändert festgesetzte Größe der Komponenten AWT, Swing, JavaFX & SWT 12
S Gridlayout - Tabellenzeile "beenden" AWT, Swing, JavaFX & SWT 3
Dragonfire GridLayout Probleme AWT, Swing, JavaFX & SWT 4
A JLabel, Icons und GridLayout AWT, Swing, JavaFX & SWT 3
C JPanel-Array in GridLayout AWT, Swing, JavaFX & SWT 4
G SWT GridLayout AWT, Swing, JavaFX & SWT 3
N Gridlayout 2. Spalte füllen AWT, Swing, JavaFX & SWT 4
W Problem mit GridLayout AWT, Swing, JavaFX & SWT 11
K Problem mit nem GridLayout AWT, Swing, JavaFX & SWT 5
T GridLayout, zu wenig Platz zwischen Widgets AWT, Swing, JavaFX & SWT 3
T SWT/Eclipse Form Controls zur Laufzeit hinzufügen,GridLayout AWT, Swing, JavaFX & SWT 4
M GridLayout mit fester Größe möglich? AWT, Swing, JavaFX & SWT 3
E Einfache Frage zu GridLayout AWT, Swing, JavaFX & SWT 35
G Größe der einzelenen Felder im GridLayout einstellbar? AWT, Swing, JavaFX & SWT 5
P Canvas in JFrame mit GridLayout AWT, Swing, JavaFX & SWT 4
F GridLayout: verschiedene Spaltenbreiten AWT, Swing, JavaFX & SWT 2
S GridLayout ? AWT, Swing, JavaFX & SWT 5
D AutoResize bei GridLayout ausschalten? AWT, Swing, JavaFX & SWT 2
D GridLayout mit nur einer Spalte, aber n Zeilen AWT, Swing, JavaFX & SWT 2
E GridLayout seltsame Anordnungsstrategie AWT, Swing, JavaFX & SWT 6
S Problemen mit Canvas-Objekten im GridLayout AWT, Swing, JavaFX & SWT 8
L Grids benennen beim GridLayout AWT, Swing, JavaFX & SWT 5
S GridLayout mit sehr großen Abständen AWT, Swing, JavaFX & SWT 3
I SWT GridLayout AWT, Swing, JavaFX & SWT 5
V Frage zu GridLayout. AWT, Swing, JavaFX & SWT 3
P SWT GridLayout AWT, Swing, JavaFX & SWT 5
O gridlayout konstante größe AWT, Swing, JavaFX & SWT 3
TRunKX Problem mit dem GridLayout und den proportionen AWT, Swing, JavaFX & SWT 4
P SWT: GridLayout und Textfelder AWT, Swing, JavaFX & SWT 1
M GridLayout funktioniert nicht mehr. AWT, Swing, JavaFX & SWT 2
F GridLayout horizontal ausrichten AWT, Swing, JavaFX & SWT 6
K GridLayout: Colspan, Rowspan AWT, Swing, JavaFX & SWT 2
R GridLayout spinnt AWT, Swing, JavaFX & SWT 14
C leeres Element in Gridlayout einfuegen AWT, Swing, JavaFX & SWT 3
D Problem bei GridLayout und JPanels AWT, Swing, JavaFX & SWT 4
J GridLayout AWT, Swing, JavaFX & SWT 5
H GridLayout: Größe einer Komponente ändern AWT, Swing, JavaFX & SWT 2
L Frage zum GridLayout AWT, Swing, JavaFX & SWT 4
G kann man die aufteilung von GridLayout beeinflussen ? AWT, Swing, JavaFX & SWT 10
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
E JPanel verschiebt sich nach add AWT, Swing, JavaFX & SWT 13
G JFrame mit background bild -> verschiebt Buttons ? AWT, Swing, JavaFX & SWT 23

Ähnliche Java Themen

Neue Themen


Oben