Java 在JTable中选择第0行时,选择处理程序会发疯
我对JTable的选择处理程序有问题 从控件中的刷新线程每隔15秒更新一次表 我想在JTable中选择一行并提取一列内容,我将使用该列内容构建文件名 只要刷新期间未选择行0,一切正常。但是,如果在触发刷新时选择了行0,则它看起来会在setAppserverData过程和事件处理程序之间跳跃,直到它超过表的行数,并且我得到一个IndexOutOfBoundsException 我是一个Java新手,这是我知识的边缘,所以我很难找出代码的错误。我的直觉是,这与我试图实现MVC结构有关,而我未能以正确的方式分离代码 //控制器Java 在JTable中选择第0行时,选择处理程序会发疯,java,swing,model-view-controller,jtable,listselectionlistener,Java,Swing,Model View Controller,Jtable,Listselectionlistener,我对JTable的选择处理程序有问题 从控件中的刷新线程每隔15秒更新一次表 我想在JTable中选择一行并提取一列内容,我将使用该列内容构建文件名 只要刷新期间未选择行0,一切正常。但是,如果在触发刷新时选择了行0,则它看起来会在setAppserverData过程和事件处理程序之间跳跃,直到它超过表的行数,并且我得到一个IndexOutOfBoundsException 我是一个Java新手,这是我知识的边缘,所以我很难找出代码的错误。我的直觉是,这与我试图实现MVC结构有关,而我未能以正确
// Appserver worker
class AppserverWorker extends SwingWorker<Integer, Integer>{
protected Integer doInBackground() throws Exception{
// Check appservers
while(true){
theModel.readAppservData();
// Update action buttons
try {
if(!theModel.isStatusOk()){
theGui.actionButtonPanel.setAppServBtnColor("RED");
// theGui.actionButtonPanel.setButtonFlashOn();
}else theGui.actionButtonPanel.setAppServBtnColor("GREEN");
} catch (IllegalArgumentException e1) {
sysLogger.logMsg("SEVERE",e1.getMessage());
JOptionPane.showMessageDialog(null, e1.getMessage());
}
// Update GUI
theGui.extAppServPanel.setAppserverData(theModel.getAppservData());
// Sleep refresh time
// TODO read refresh from init table
try {
Thread.sleep(appServRefreshTime);
} catch (InterruptedException e) {}
}
}
// List selection handler
class SharedListSelectionHandler implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()){ // To avoid double trigger of listener
System.out.println(">>>>>>>>> Selection list handler >>>>>>>>");
String fileName = null;
String fileExt = ".txt";
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
try {
int selectedRow = lsm.getAnchorSelectionIndex(); // Get the row clicked
if (selectedRow>=0){ // If -1 no row selected
fileName = theGui.extAppServPanel.getAppservName(selectedRow)+fileExt; // Get appserver name and build file name
theModel.readCollectFile(InitParameters.collectFilePath, fileName); // Read collect file
theGui.extAppServPanel.setAppservInfo(theModel.getCollectFileContent()); // Fill the text panel with collect file
}
}
catch(FileNotFoundException e1){
sysLogger.logMsg("SEVERE",this.getClass().getSimpleName()+": Collect file "+fileName+" is missing");
JOptionPane.showMessageDialog(null, "Collect file "+fileName+" is missing");
}
catch(IOException e1){
sysLogger.logMsg("SEVERE",this.getClass().getSimpleName()+": System error: An I/O error occurred");
System.err.println("System error: An I/O error occurred");
System.exit(0);;
}
}
}
}
选择零行并运行刷新线程时跟踪输出
** Appserver worker **
CmtModel: readAppservData
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>> Rowcount = 8
** Appserver worker **
CmtModel: readAppservData
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 0 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 1 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 2 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 3 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 4 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 5 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 6 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 7 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 8 <<
java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at panels.ExtAppServPanel.getAppservName(ExtAppServPanel.java:219)
at Control$SharedListSelectionHandler.valueChanged(Control.java:330)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source)
at javax.swing.JTable.tableRowsInserted(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at panels.ExtAppServPanel.setAppserverData(ExtAppServPanel.java:172)
at Control$AppserverWorker.doInBackground(Control.java:434)
at Control$AppserverWorker.doInBackground(Control.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
**Appserver工作程序**
CmtModel:readAppservData
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:已选择显示=0>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:选择了row=1>>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:选择了row=2>>>>>>>>>>更新表格>>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:选择了row=3>>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:选择了row=4>>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:选择了row=5>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:选择了row=6>>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控件:已选择Drow=7>>>>>>>>>更新表格>>>>>>>
>>>>>>>>>选择列表处理程序!>>>>>>>
>>控制器:selectedRow=8
不要在doInBackground()
方法中更新模型或GUI
GUI的所有更新都应在EventDispatchThread(EDT)
上完成
相反,当数据更改时,您需要“发布”结果,以便代码可以在SwingWorker
的过程(…)
方法中执行,该方法在EDT上执行,因此GUI将在EDT上更新
有关更多信息,请阅读上的Swing教程部分。关于具有中间结果的任务的部分有一个发布方法的示例。您不断更新表,这将对您的选择处理造成严重破坏。您还违反了Swing在多个实例上的单线程规则显然我必须深入研究线程处理,但是表的更新呢?您的SwingWorker
应该使用publish
/进程
功能将更新发送到UI。你发送的内容将取决于你想如何实现它。更详细地看一看,当我意识到这已成为av MVC的更多问题时,我想感谢MadProgrammer和camickr的宝贵投入,并开始一个新的线程,它更专注于手头的问题。
** Appserver worker **
CmtModel: readAppservData
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 0 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 1 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 2 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 3 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 4 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 5 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 6 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 7 <<
>>>>>>>>> Updating the table >>>>>>>>
>>>>>>>>> Selection list handler ! >>>>>>>>
>> Controll: selectedRow = 8 <<
java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at panels.ExtAppServPanel.getAppservName(ExtAppServPanel.java:219)
at Control$SharedListSelectionHandler.valueChanged(Control.java:330)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source)
at javax.swing.JTable.tableRowsInserted(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at panels.ExtAppServPanel.setAppserverData(ExtAppServPanel.java:172)
at Control$AppserverWorker.doInBackground(Control.java:434)
at Control$AppserverWorker.doInBackground(Control.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
// Update GUI
theGui.extAppServPanel.setAppserverData(theModel.getAppservData());