Как обновить sh JTable, используя 2d массив? - PullRequest
2 голосов
/ 23 апреля 2020

Я реализовал JTable и заполнил его с помощью 2D-массива. Вот как я это сделал

public JTable executeTable(  ) {
            Object[] columns = new String[] {
                    "ID", "Room No", "Floor No", "CO2 Level", "Smoke Level", "Status"
            };

            ArrayList<FloorDetails> arrayList = clientMain.getSensors();

            Object[][] data = new Object[arrayList.size()][6];

            for(int i = 0; i < arrayList.size(); i++) {
                data[i][0] = arrayList.get(i).getId();
                data[i][1] = arrayList.get(i).getRoomNo();
                data[i][2] = arrayList.get(i).getFloorNo();
                data[i][3] = arrayList.get(i).getCo2Level();
                data[i][4] = arrayList.get(i).getSmokeLevel();
                data[i][5] = arrayList.get(i).getStatus();
            }

            table = new JTable(data,columns) {

                @Override
                public boolean isCellEditable(int row, int column) {
                    // TODO Auto-generated method stub
                    return column == 0 || column == 3 || column == 4 || column == 5 ? true : false;
                }

            };
            frame.setTitle("Sensor Details");
            return table;
        }
private void initialize() {

        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        table = executeTable();
        frame.getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START);
        frame.getContentPane().add(table, BorderLayout.CENTER);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setTitle("Sensor Details");
}

Теперь меня просили обновлять sh таблицу каждые 30 секунд. Поэтому я пытаюсь реализовать приведенный ниже таймер для обновления sh таблицы. Но я не понимаю, как установить значения (refre sh таблица), используя двумерный массив, поскольку я получаю все значения с сервера в ArrayList

public void refreshTimer() {
         Timer timer = new Timer(0, new ActionListener() {

               @Override
               public void actionPerformed(ActionEvent e) {

                    ArrayList<FloorDetails> arrayList = clientMain.getSensors();

                    Object[][] data = new Object[arrayList.size()][6];

                    for(int i = 0; i < arrayList.size(); i++) {
                        data[i][0] = arrayList.get(i).getId();
                        data[i][1] = arrayList.get(i).getRoomNo();
                        data[i][2] = arrayList.get(i).getFloorNo();
                        data[i][3] = arrayList.get(i).getCo2Level();
                        data[i][4] = arrayList.get(i).getSmokeLevel();
                        data[i][5] = arrayList.get(i).getStatus();
                    }

                  //I want to refresh the table with new data set received from the server as an array list
               }
            });

            timer.setDelay(30000); // delay for 30 seconds
            timer.start();
     }

. Я нашел некоторые примеры по inte rnet с использованием метода fireDataChanged. Но все они напрямую получают данные, используя ResultSet. В моем случае я получаю ArrayList. Как мне этого добиться? Или есть другой способ сделать это? Заранее спасибо!

1 Ответ

1 голос
/ 23 апреля 2020

Добавьте метод updateTable в класс с помощью методов initialize и executeTable.

public void updateTable(List<FloorDetails> arrayList) {
    DefaultTableModel dataModel = new DefaultTableModel();

    for (int i = 0; i < arrayList.size(); i++) {
        Object[] rowData = new Object[6];
        rowData[0] = arrayList.get(i).getId();
        rowData[1] = arrayList.get(i).getRoomNo();
        rowData[2] = arrayList.get(i).getFloorNo();
        rowData[3] = arrayList.get(i).getCo2Level();
        rowData[4] = arrayList.get(i).getSmokeLevel();
        rowData[5] = arrayList.get(i).getStatus();
        dataModel.addRow(rowData);
    }

    table.setModel(dataModel);
}

Передайте экземпляр класса анонимному классу в вашем Timer и вызовите метод updateTable. Используйте метод SwingUtilities invokeLater для вызова updateTable, чтобы обновление JTable выполнялось в потоке Event Dispatch .

Вы также можете изменить свой метод executeTable для использования DefaultTableModel.

...