2016-03-28 5 views
0

Когда я запустил его, таблица должна быть пустой, но после нажатия кнопки «Загрузить данные» я хочу, чтобы она отображала данные, которые я получаю из базы данных. Когда я проверю возвращенные данные в этой части:Метод Java JTable repaint() не работает после изменения данных

for (i=0; i < data.length; i++){ 
    for (j=0; j < 4; j++){ 
     if (data[i][j] != null) 
      System.out.print(data[i][j] + " "); 
    } 
    if (data[i][j-1] != null) 
     System.out.println(); 
} 

Это правильно, поэтому никаких проблем с этим я не думаю. Может кто-нибудь объяснить, почему repaint() не работает или что я делаю неправильно?

Вот мой код:

public class UserInterface { 

    JFrame frame = new JFrame("User Interface"); 
    JPanel panel = new JPanel(); 
    JButton button = new JButton("Load Data"); 
    JTable table; 
    JScrollPane scrollPane; 
    String[] columnNames = {"name", "age", "address", "phone number"}; 
    String[][] data = new String[100][4]; 

    public UserInterface(){ 

     frame.getContentPane().setSize(200, 300); 
     table = new JTable(data, columnNames); 
     scrollPane = new JScrollPane(table); 
     panel.add(button); 
     panel.add(scrollPane); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

     button.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
       ConnectDatabase cd = new ConnectDatabase(); 
       try { 
        data = cd.getData(); 
        System.out.println("we got the data from db on the ui."); 
        int i, j; 
        for (i=0; i<data.length; i++){ 
         for (j=0; j<4; j++){ 
          if (data[i][j] != null) 
           System.out.print(data[i][j] + " "); 
         } 
         if (data[i][j-1] != null) 
          System.out.println(); 
        } 
       } catch (ClassNotFoundException e1) { 
       // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } catch (SQLException e1) { 
       // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       table.repaint(); 
       scrollPane.repaint(); 
       System.out.println("table repaint is done."); 
      } 
     }); 

    } 


    @SuppressWarnings("unused") 
    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
     UserInterface ui = new UserInterface(); 
    } 

} 
+0

Try вызова Validate() или перепроверить() метод или Invalidate() вместе с перекрашивать(). –

ответ

2

Это, кажется, работает для меня, когда я установил значение в data. Вы меняете объект данных на data = cd.getData();, чтобы таблица не знала, что вы сделали. Попробуйте просмотреть возвращаемые данные и обновить исходный массив, например:

String[][] temp = cb.getData(); 
for (i=0; i<temp.length; i++){ 
    for (j=0; j<4; j++){ 
     data[i][j] = temp[i][j]; 
    } 
} 

Хотя будут ли два массива одинакового размера? Я бы рекомендовал использовать TableModel и сделать это, например:

DefaultTableModel model = new DefaultTableModel(new Object[]{"name", "age", "address", "phone number"},0); 
table = new JTable(model); 

// Now when you populate the table, you would do this for example: 
String[][] temp = cb.getData(); 
for (i=0; i<temp.length; i++){ 
    model.addRow(new Object[]{temp[i][0],temp[i][1],temp[i][2],temp[i][3]}); 
} 
+0

Спасибо, он работает. – kata

+0

Если я напишу его, как в вашем втором примере, второй для этого не нужен, но это действительно лучший способ сделать это. Еще раз спасибо. – kata

2

repaint не способ сделать это. Вы должны удалить оба вызова, чтобы перекрасить().

Обновление ваших массивов не будет иметь никакого значения, потому что JTable сделал копию их во время строительства и больше не использует их.

Вы должны сказать модель вашей таблицы, чтобы использовать (копию) новые данные:

DefaultTableModel model = (DefaultTableModel) table.getModel(); 
model.setDataVector(data, columnNames);