2015-05-08 6 views
0

Im используя JTable, загружая на него разные данные в зависимости от нажатой кнопки.JTable с 2 различными данными

Проблема: когда загружается одна из данных, если я пытаюсь загрузить другую и передаю курсор мыши над заголовком или ячейкой, он обновляет заголовок/ячейку данными с первого ввода, если есть данные по выбранному заголовку/ячейке.

Любые идеи о том, как их решить? Это код, который использует.

private static void setCompromissosTable(Object[][] data, Object[] header){ 
    try{ 
     compromissosTable.removeAll(); 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } 

    compromissosTable = new JTable(data, header); 
    compromissosTable.setRowSelectionAllowed(true); 


    // Make the entire row selectable, but not editable 
    int columnMax = compromissosTable.getColumnCount(); 
    for(int column = 0; column < columnMax; column++){ 
     Class<?> col_class = compromissosTable.getColumnClass(column); 
     compromissosTable.setDefaultEditor(col_class, null); 
    } 

    scrollPane = new JScrollPane(compromissosTable); 
    pane.add(scrollPane); 

    scrollPane.setBounds(btnAddCompromisso.getX(), 
      btnAddCompromisso.getHeight() + btnAddCompromisso.getY() + 5 
      , frame1.getWidth() - 20 
      , frame1.getHeight() - 20); 

    compromissosTable.revalidate(); 
    compromissosTable.repaint(); 

    compromissosTable.addMouseListener(new MouseAdapter() {} 
    //Change mouse behavior. 
    ); 


} 
+0

Моя первая мысль не создавать или измените сам 'JTable', но просто отключите модели. – MadProgrammer

+0

Вы, похоже, используете макеты' null', что, вероятно, означает, что на основе вашего примера вы просто «перекрываете» новую таблицу поверх старой, именно поэтому вы, вероятно, получаете сбои в живописи. Вместо этого избегайте макетов 'null', не создавайте новый' JTable' каждый раз, а просто обновляйте существующую 'JTable' с помощью новой модели. – MadProgrammer

ответ

1

Это подозрительно ...

compromissosTable = new JTable(data, header); 
//... 
scrollPane = new JScrollPane(compromissosTable); 
pane.add(scrollPane); 

В принципе, если предположить, что каждый раз, когда вы хотите, чтобы переключить наборы данных, вы вызываете этот метод, вы создаете новый JTable и JScrollPane каждый раз и затем добавляет его в UI ...

Как насчет предыдущих JTable?

Следующая это ...

scrollPane.setBounds(btnAddCompromisso.getX(), 
     btnAddCompromisso.getHeight() + btnAddCompromisso.getY() + 5 
     , frame1.getWidth() - 20 
     , frame1.getHeight() - 20); 

Это выглядит как вы используете null макет. В основном то, что он «выглядит», как это происходит, заключается в том, что вы просто складываете однонаправленные друг с другом JScrollPane s, что объясняет, в частности, графические сбои, поскольку компоненты фактически добавляются с одинаковой z-глубиной (по существу) и конкурируют друг с другом, после чего они обновляются.

Два простых ответов ...

  1. Не используйте null макеты. Конечно, они «кажутся» хорошей идеей, но у них есть склонность поворачиваться и укусить вас странными и прекрасными способами, которые трудно диагностировать и исправлять. Используйте API управления макет, который Свинг был разработан вокруг
  2. Update в JTable сек модели вместо создания нового JTable/JScrollPane каждый раз

См How to use tables и Laying Out Components Within a Container

+0

Искали способы установки нового заголовка/данных в JTable, но не смогли найти способ заменить его (просто удалите или добавьте его). Но в любом случае проблема заключалась в добавлении новой scrollPanel в пользовательский интерфейс каждый раз, когда данные менялись, а старый все еще получал мой MouseEvent. Просто удаляя scrollPanel каждый раз, прежде чем добавлять его, снова решена моя проблема. Спасибо за помощь! –

+0

'JTable # setModel' приведет к перезагрузке всей таблицы, а заголовки столбцов будут удалены автоматически – MadProgrammer

Смежные вопросы