简体   繁体   English

在fireTableDataChanged之后jtable不会更新,重新验证并重新绘制

[英]jtable not update after fireTableDataChanged, revalidate and repaint

It downloads data from ThingSpeak and show in jtable. 它从ThingSpeak下载数据并在jtable中显示。 I create a 'refresh' button which will download latest data and show in existing gui table. 我创建了一个“刷新”按钮,它将下载最新数据并显示在现有的gui表中。

  1. get the latest data...work 获取最新数据...工作
  2. store in List/arrays...work 存储在列表/数组中...工作
  3. update the jtable...Nop 更新jtable ... Nop

I have tried fireTableDataChanged, setModel, revalidate, invalidate and repaint but still doesn't update the table. 我已经尝试过fireTableDataChanged,setModel,revalidate,invalidate和repaint但仍然没有更新表。 What am I missing? 我错过了什么?

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

        }
    });

}
}

Problem solve, I forgot to clear the list 'records_data' :| 问题解决了,我忘了清除'records_data'列表:| I will leave it here if someone face the same problem and mind blown for 2 days like me 如果有人像我一样面对同样的问题和思绪,我会留在这里

Working code: 工作代码:

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

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM