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
并在那里定义所有内容。我只是提供了一个尽可能少改动的解决方案。