Frage

Ich habe ein paar ziemlich seltsame Symptome mit JPanels und Cardlayout. Im Wesentlichen hat ich Karten, die Tat als „Seiten“, da ich nur 12 Zellen auf dem Gitter halten kann, und ich zeige jede Seite als eine Karte, und klicken -> und <- Tasten Seiten entsprechend ändern (oder das ist die Idee). Da diese Daten ein wechselndes Modell repräsentiert, alle fünf Sekunden wollte ich neue Karten aktualisiert Anzeige von Informationen werden hinzugefügt haben, und einfach die alten Seiten entfernen.

Im Wesentlichen habe ich die ersten Seiten konstruieren, wenn das Programm gestartet:

public OrderSimPanel() {
    super( new CardLayout() );

    // Create the map
    frames = new TreeMap<Integer, String>();

    // Update and draw
    refreshRelevantOrders();
    drawPanel();

    // Set a timer for future updating
    java.util.Timer timer = new java.util.Timer();
    timer.schedule(new UpdateTask(), 5000);

    System.out.println("Constructor DOES get called");
    System.out.println("Panel type is " + this.getLayout().getClass().getName() );
}

Wo refershReleventOrders () nur aktualisiert eine Liste, und DrawPanel () ist so etwas wie folgt aus:

private void drawPanel() {
    System.out.println("Panel type is " + this.getLayout().getClass().getName() );

    // Set all old frames to deprecated
    for( Integer k : frames.keySet() ) {
         String o = frames.get( k );
         frames.remove(k);
         k = -k;
         frames.put(k, o);
    }

    // Frame to add to
    JPanel frame = new JPanel( new GridLayout(3,4) );
    int f = 0;

    // Create new cells in groups of 12
    for( int i = 0; i < orders.size(); i++ ) {
        // Pagination powers activate!
        int c = i % 12;
        f = i / 12;

        // Create a new panel if we've run out of room on this one
        if ( c == 0 && i > 0 ) {
            // Add old frame
            String id = new Double( Math.random() ).toString();
            frames.put(f, id);
            add( frame, id );

            // Create new one
            frame = new JPanel( new GridLayout(3,4) );
        }

        // Add the order cell to the panel
        frame.add(new OrderCellPanel( orders.get(i) ));

        i++;
    }

    // Add last frame
    String id = new Double( Math.random() ).toString();
    frames.put(f, id);
    add( frame, id );

    // Set active frame to 0'th frame
    ((CardLayout)(this.getLayout())).show(this, frames.get(0));

    // Erase other frames and from map
    for( Integer k : frames.keySet() ) {
        if( k < 0 ) {
            this.remove(0);
            frames.remove(k);
        }
    }
}

Die Timer Aufgabe im Konstruktor erstellt ruft refreshRelevantOrders () ein DrawPanel (). Die anfänglichen Druckausgabe sieht wie folgt aus:

Panel type is java.awt.CardLayout
Constructor DOES get called
Panel type is java.awt.CardLayout

Aber wenn der Zeitgeber ausgeführt wird, wird dies angezeigt:

Panel type is javax.swing.GroupLayout

Und natürlich nicht das Casting Code in DrawPanel (). Vielen Dank für alle Ideen!

War es hilfreich?

Lösung

außer Kraft setzen setLayout () -Methode, und drucken Sie die alten / neue Layout Klassennamen gibt (vor oder nach der Super-Implementierung aufrufen). Auf diese Weise werden Sie sehen, welcher Teil des Codes setzt Grouplayout auf dem Panel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top