2010-05-10 5 views
0

У меня есть некоторые довольно странные симптомы с JPanels и CardLayout. По сути, у меня есть карточки, которые действуют как «страницы», так как я могу удерживать только 12 ячеек в сетке, и я показываю каждую страницу как карту, а нажатие -> и < - кнопки соответственно меняют страницы (или это идея). Поскольку эти данные представляют собой изменяющуюся модель, каждые пять секунд я собираюсь добавить новые карты, отображая обновленную информацию, и просто удаляю старые страницы.Java Swing, похоже, меняет макет из макета карты

По существу, я построить начальные страницы при запуске программы:

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()); 
} 

Где refershReleventOrders() просто обновляет список, и 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); 
     } 
    } 
} 

Таймер задача, созданная в конструкторе, вызывает refreshRelevantOrders() drawPanel(). Первоначальный вывод на печать выглядит следующим образом:

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

Но когда таймер выполняется, отображается следующим образом:

Panel type is javax.swing.GroupLayout 

И, конечно же, код отливка в drawPanel() терпит неудачу. Спасибо за любые идеи!

ответ

2

Переопределить метод setLayout() и напечатать старые/новые имена классов макета там (до или после вызова супер реализации). Таким образом вы увидите, какая часть вашего кода задает GroupLayout на панели.

+0

Хорошо, я обнаружил, что какой-то код макета панели, к которой он принадлежит, менял макет (написанный другим разработчиком). Благодаря! –