Java 如何在JTable中填充数据?

Java 如何在JTable中填充数据?,java,swing,jtable,defaulttablemodel,Java,Swing,Jtable,Defaulttablemodel,我正在尝试更新我的表,但它不起作用。在调用该表的整个程序完成之前,该表不会显示。我怎样才能改变这个?打开窗口后,我想用数据填充JTable。如果我停止代码的执行,表中就会充满数据。我需要一根线吗?我如何正确使用一个?我的代码如下 public class TestGUI extends DefaultTableCellRenderer implements TeststepEventListener { public JFrame frame; private JTable t

我正在尝试更新我的表,但它不起作用。在调用该表的整个程序完成之前,该表不会显示。我怎样才能改变这个?打开窗口后,我想用数据填充
JTable
。如果我停止代码的执行,表中就会充满数据。我需要一根线吗?我如何正确使用一个?我的代码如下

public class TestGUI extends DefaultTableCellRenderer implements TeststepEventListener {

    public JFrame frame;
    private JTable testcase_table;
    private JTable teststep_table;

    /**
     * Create the application.
     */
    public TestGUI() {
        initialize();
        frame.setVisible(true);
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JProgressBar progressBar = new JProgressBar();
        progressBar.setBounds(50, 68, 700, 14);
        frame.getContentPane().add(progressBar);

        JTextPane txtpnAutomotiveHmi = new JTextPane();
        txtpnAutomotiveHmi.setText("Automotive HMI");
        txtpnAutomotiveHmi.setBounds(362, 21, 205, 20);
        frame.getContentPane().add(txtpnAutomotiveHmi);

        testcase_table = new JTable();
        testcase_table.setBounds(50, 125, 350, 426);
        frame.getContentPane().add(testcase_table);

        teststep_table = new JTable();
        teststep_table.setBounds(399, 125, 350, 426);
        frame.getContentPane().add(teststep_table);
    }
    private boolean testcase = true;

    @Override
    public void myEventOccurred(TeststepEvent event) {
        TeststepData data = event.data();
        if (testcase) {
            set_values(data.getDoc(), data.getTestcase());
        }
        testcase = false;

    }
    private int i = 0;
    LinkedList names = new LinkedList();

    private void set_values(Document doc, int testcase) {
        frame.setTitle("Wuratbrot" + i);
        i++;
        Element element = doc.getRootElement();
        names.clear();
        if (element != null) {
            List<Element> testCases = element.getChildren();
            //testcase_table.removeAll();
            //String[] title = {"Testcases"};


            for (Element testCase : testCases) {
                names.add(testCase.getAttributeValue("name"));
            }

            DisplayData(names);
        }

        testcase_table.revalidate();
        frame.validate();
    }

    private void DisplayData(List<String> Testcases) {

        DefaultTableModel aModel = new DefaultTableModel() {
            //setting the jtable read only
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        //setting the column name
        Object[] tableColumnNames = new Object[1];
        tableColumnNames[0] = "TestCases";


        aModel.setColumnIdentifiers(tableColumnNames);
        if (Testcases == null) {

            testcase_table.setModel(aModel);

            return;
        }

        Object[] objects = new Object[1];
        ListIterator<String> lstrg = Testcases.listIterator();
        //populating the tablemodel
        while (lstrg.hasNext()) {
            String newcus = lstrg.next();
            objects[0] = newcus;


            aModel.addRow(objects);
        }

        //binding the jtable to the model
        testcase_table.setModel(aModel);
    }
}
公共类TestGUI扩展DefaultTableCellRenderer实现TeststepEventListener{
公共框架;
专用JTable testcase_表;
专用JTable teststep_表;
/**
*创建应用程序。
*/
公共TestGUI(){
初始化();
frame.setVisible(true);
}
/**
*初始化框架的内容。
*/
私有void初始化(){
frame=新的JFrame();
机架立根(100100800600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JProgressBar progressBar=新的JProgressBar();
前进杆.立根(50,68,700,14);
frame.getContentPane().add(progressBar);
JTextPane txtpAutomotiveHMI=新JTextPane();
txtpAutomotiveHMI.setText(“汽车HMI”);
TXTPNATOMOTIVEHMI.立根(362,21,205,20);
frame.getContentPane().add(txtpAutomotiveHMI);
testcase_table=new JTable();
testcase_table.setBounds(50、125、350、426);
frame.getContentPane().add(testcase_表);
teststep_table=new JTable();
测试步骤表.立根(399125350426);
frame.getContentPane().add(teststep_表);
}
私有布尔testcase=true;
@凌驾
公共无效MyEventToCurred(TeststepEvent事件){
TeststepData=event.data();
if(测试用例){
设置_值(data.getDoc(),data.getTestcase());
}
testcase=false;
}
私有整数i=0;
LinkedList名称=新建LinkedList();
私有void set_值(文档文档,int testcase){
帧集标题(“Wuratbrot”+i);
i++;
Element=doc.getRootElement();
name.clear();
if(元素!=null){
List testCases=element.getChildren();
//testcase_table.removeAll();
//字符串[]title={“Testcases”};
for(元素testCase:testCases){
name.add(testCase.getAttributeValue(“name”);
}
显示数据(名称);
}
testcase_table.revalidate();
frame.validate();
}
私有void DisplayData(列出测试用例){
DefaultTableModel aModel=新的DefaultTableModel(){
//将jtable设置为只读
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
//设置列名
Object[]tableColumnNames=新对象[1];
tableColumnNames[0]=“TestCases”;
aModel.setColumnIdentifiers(tableColumnNames);
if(Testcases==null){
testcase_table.setModel(aModel);
返回;
}
Object[]objects=新对象[1];
ListIterator lstrg=Testcases.ListIterator();
//填充表格模型
while(lstrg.hasNext()){
字符串newcus=lstrg.next();
对象[0]=newcus;
aModel.addRow(对象);
}
//将jtable绑定到模型
testcase_table.setModel(aModel);
}
}

您需要功能
fireTableDataChanged
。更改表格单元格的值后,应在表格模型上调用该函数。

您需要函数
fireTableDataChanged
。更改表格单元格的值后,应在表格模型上调用它。

用于此目的。数据采集可以在
doInBackground()
中异步进行,而
process()
通过安全地更新事件调度线程上的
TableModel
。具体请参见标题为和的章节。此外,
DefaultTableModel
会触发相应的更新事件,
JTable
会监听这些事件。不需要额外的代码。另一方面,使用布局而不是
setBounds()

是用于此目的的。数据采集可以在
doInBackground()
中异步进行,而
process()
通过安全地更新事件调度线程上的
TableModel
。具体请参见标题为和的章节。此外,
DefaultTableModel
会触发相应的更新事件,
JTable
会监听这些事件。不需要额外的代码。另一方面,使用布局而不是
setBounds()

以获得更好的帮助,更快发布一个简短、可运行、可编译的文件,并将DefaultTableModel的值硬编码为本地变量,更快发布简短、可运行、可编译的文件以获得更好的帮助,将DefaultTableModel的值硬编码为局部变量
DefaultTableModel
方法触发事件;我们不应该在模型之外做这件事。是的,最好的做法是使用
AbstractTableModel
并在那里定义所有内容。我只是提供了一个尽可能少更改的解决方案。
DefaultTableModel
方法触发事件;我们不应该在模型之外做这件事。是的,最好的做法是使用
AbstractTableModel
并在那里定义所有内容。我只是提供了一个尽可能少改动的解决方案。