java - 使用线程在 JTable 中插入行

标签 java multithreading swing jframe jtable

我是 Java Swing 新手。我花了很多时间试图找到一种使用 run() 方法将行插入到 JTable 中的方法,但尚未找到。那么,谁能给我一个解决方案。

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class ShowTable extends JFrame {
    JFrame f=new JFrame();
    JTable jt=new JTable(new DefaultTableModel());
    DefaultTableModel model=(DefaultTableModel)jt.getModel();

    public void showdata(int count, String host, String ip, String os_name, String os_arch, String os_version, String pro_detail, String Mac_add, float  disk_size, float max_memory) {
        System.out.println("Row  :"+count);
        Object data[] = {host, ip, os_name, os_arch, os_version, pro_detail, Mac_add, disk_size, max_memory};
        if (count == 0)
        {       
            model.addColumn("HOSTNAME");
            model.addColumn("IP ADDRESS");
            model.addColumn("OS NAME");
            model.addColumn("OS ARCHITECTURE");
            model.addColumn("OS VERSION");
            model.addColumn("PROCESSOR DETAIL");
            model.addColumn("MAC ADDRESS");
            model.addColumn("HARD DISK");
            model.addColumn("RAM SIZE");
            model.addRow(data);  
        }
        else
        {
            model.addRow(data);
        }
        jt.setBounds(30,40,200,300);
        jt.setFocusable(false);
        jt.setRowSelectionAllowed(false);
        JScrollPane sp = new JScrollPane(jt);
        f.add(sp);
        f.setSize(1300,100);
        f.setVisible(true);
    }

    public static void main() {
        JScrollPane jScrollPane1;
        JTable jTable1;
    }
}

我编写了这段代码,但每次执行 run() 方法时它只显示一个空白帧。

最佳答案

其他线程的修改应该通过SwingUtilities.invokeLater进行,例如:

SwingUtilities.invokeLater(() -> {
    // code to be invoked in awt thread
});

下面的工作示例(每秒添加新行):

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;

public class ShowTable extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            startApp();
        });

    }

    static void startApp(){
        JFrame frame = new JFrame();


        DefaultTableModel model = new DefaultTableModel(0, 1);
        JTable table = new JTable(model);
        frame.getContentPane().add(new JScrollPane(table));

        frame.setSize(new Dimension(800, 600));
        frame.setVisible(true);

        new Thread(){
            @Override
            public void run() {
                while(true) {
                    SwingUtilities.invokeLater(() -> {
                        model.addRow(new Object[]{"some data"});

                    });
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}

关于java - 使用线程在 JTable 中插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48985198/

相关文章:

java - 在Java中设置文件创建时间戳

iphone - 如何告诉 iPhone OS 功能停止/取消?

c++ - std::atomic bool 或 Normal global bool 在单线程中好用吗?

java - 使用 Jackson 或 Gson 的 Jsonpath

java - 如何在图表引擎图下添加 TextView

java - BasicTabbedPaneUI 绘制 html 文本

java - 带有 Java GUI Builder 的 GUI,用于上传图像并动态显示到面板(在 GUI 内)

python - pymysql.err.InterfaceError : (0, '' ) 对 sql 表进行大量推送时出错

java - setBackground 在 Windows 7 中不起作用

java - 如何限制 JLabel 中使用的 GUI 中字符串中零 (0) 的数量