يبدو أن أرجوحة جافا تغير التصميم من تخطيط البطاقة
-
25-09-2019 - |
سؤال
أعاني من بعض الأعراض الغريبة مع jpanels و colourlayout. في الأساس ، لدي بطاقات تعمل كصفحات "حيث لا يمكنني الاحتفاظ بـ 12 خلية فقط على الشبكة ، وأعرض كل صفحة كبطاقة ، والنقر فوق -> و < - أزرار تغيير الصفحات وفقًا لذلك (أو هذه هي الفكرة). نظرًا لأن هذه البيانات تمثل نموذجًا متغيرًا ، فإن كل خمس ثوانٍ كنت سأضاف بطاقات جديدة لعرض المعلومات المحدثة ، وبعيدًا عن إزالة الصفحات القديمة.
في الأساس ، أقوم ببناء الصفحات الأولية عندما يبدأ البرنامج:
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() );
}
حيث يشير releventorders () فقط يقوم بتحديث قائمة ، و DrawPanel () شيء من هذا القبيل:
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);
}
}
}
تدعو المهمة المؤقت التي تم إنشاؤها في مُنشئ SurffRefantorders () drawpanel (). يبدو أن إخراج الطباعة الأولي هكذا:
Panel type is java.awt.CardLayout
Constructor DOES get called
Panel type is java.awt.CardLayout
ولكن عندما ينفذ المؤقت ، يتم عرض هذا:
Panel type is javax.swing.GroupLayout
وبالطبع ، فشل رمز الصب في drawpanel (). شكرا على أي أفكار!
المحلول
تجاوز طريقة setLayout () ، وطباعة أسماء فئة التصميم القديمة / الجديدة هناك (قبل أو بعد الاتصال بالتنفيذ الفائق). وبهذه الطريقة سترى أي جزء من التعليمات البرمجية الخاصة بك يعين grouplayout على اللوحة.