Java 在JTable中选择第0行时,选择处理程序会发疯

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结构有关,而我未能以正确

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