jtable не обновляется после fireTableDataChanged, повторно проверяет и перерисовывает - PullRequest
0 голосов
/ 12 мая 2019

Загружает данные из ThingSpeak и показывает в виде таблицы. Я создаю кнопку «Обновить», которая загружает последние данные и отображается в существующей таблице графического интерфейса.

  1. получить последние данные ... работа
  2. хранить в списке / массивах ... work
  3. обновить jtable ... Нет

Я пробовал fireTableDataChanged, setModel, повторно проверять, делать недействительными и перерисовывать, но все еще не обновляет таблицу. Чего мне не хватает?

public class Menu{
protected static List<String> list_name = new ArrayList<>();
// .....(10 more like above)

private JFrame frame = new JFrame("Temp");
private List<String[]> records_data = new ArrayList<String[]>();
private JTable table;
private DefaultTableModel model;
private String[][] data2 = new String[list_channel_ID.size()][11];

String[] columnNames_records = {"Location"};  // skip 10 more items

protected Menu(){
    // Jframe > Jtabbedpane > jtable( I skip all these codes)


    //- Table(Records)
    for(int i = 0; i < list_channel_ID.size(); i++){
        records_data.add(new String[]{ list_name.get(i) });}  // Load data from List to jtable require format, skip 10 items

    //table = new JTable(records_data.toArray(new Object[][] {}), columnNames_records);  // when 'model' is not use

    model = new DefaultTableModel(records_data.toArray(new Object[][] {}), columnNames_records);

    //model = new DefaultTableModel(data2, columnNames);
    table = new JTable(model);


   JMenuItem process_refresh = new JMenuItem("Refresh");

    process_refresh.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {

            // Update the list

            for(int i = 0; i < list_channel_ID.size(); i++){
                records_data.add(new String[]{ list_name.get(i) });   // load from list again, skiped 10 item
            }
            model = new DefaultTableModel(records_data.toArray(new Object[][] {}), columnNames_records);

            model.fireTableDataChanged();
            //table.setModel(model);

            table.revalidate();
            //table.invalidate();
            table.repaint();

        }
    });

}
}

1 Ответ

0 голосов
/ 12 мая 2019

Проблема решена, я забыл очистить список «records_data»: |Я оставлю это здесь, если кто-то сталкивается с той же проблемой и сходит с ума в течение 2 дней, как я

Рабочий код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

import java.lang.String;

import java.util.List;
import java.util.ArrayList;

public class Menu{
protected static List<String> list_name = List.of("AAA", "BBB", "CCC");
// .....(10 more like above)

private JFrame frame = new JFrame("Temp");
private List<String[]> records_data = new ArrayList<String[]>();
private List<String[]> result_data = new ArrayList<String[]>();
private JTable table, table2, table3;
private DefaultTableModel model;
private String[][] data2 = new String[3][11];

String[] columnNames_records = {"item A", "item B", "item C"};  // 10 more items

protected Menu(){
    frame.setSize(1000, 600);
    frame.setLayout(new GridLayout(2, 1));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //- Back Panel
    JPanel panel = new JPanel(null);
    frame.add(panel);

    JPanel tab_panel = new JPanel(new GridLayout());
    JTabbedPane tabbedPane = new JTabbedPane();  
    tabbedPane.setBounds(5, 100, 975, 500);
    tabbedPane.add("Records", tab_panel);
    frame.add(tabbedPane);


    //- Table(Records)
    for(int i = 0; i < 3; i++){
        records_data.add(new String[]{ list_name.get(i) });
    }  // Load data from List to jtable require format, skiped 10 item

    //table = new JTable(records_data.toArray(new Object[][] {}), columnNames_records);
    model = new DefaultTableModel(records_data.toArray(new Object[][] {}), columnNames_records);
    //model = new DefaultTableModel(data2, columnNames);
    table = new JTable(model);
    table.setRowHeight(20);


    //- ScrollPane, allow scrolling if table too long
    JScrollPane scrollPane = new JScrollPane(table);
    tab_panel.add(scrollPane);


    // Menu bar
    JMenu menu_process = new JMenu("Process");
    JMenuItem process_refresh = new JMenuItem("Refresh");


    process_refresh.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {

            records_data.clear();
            list_name = List.of("DDD", "EEE", "FFF");       // Update the list, hardcode for now
            //list_name.add("KKK");

            for(int i = 0; i < 3; i++){
                records_data.add(new String[]{ list_name.get(i) });   // load from list again, skiped 10 item
            }
            model = new DefaultTableModel(records_data.toArray(new Object[][] {}), columnNames_records);


            //model.fireTableDataChanged();
            table.setModel(model);

            //table.revalidate();
            //table.invalidate();
            //table.repaint();

        }
    });

    menu_process.add(process_refresh);

    JMenuBar menu_bar = new JMenuBar();
    menu_bar.add(menu_process);
    frame.setJMenuBar(menu_bar);

    frame.setVisible(true);

}

public static void main(String[ ] args) {
    new Menu();
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...