Java Swing scheint das Layout von Kartenlayout sich zu ändern
-
25-09-2019 - |
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!
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.