java - 为什么具有 DefaultTableModel 的 JTable 不会刷新?

标签 java swing jtable defaulttablemodel

基本上我想做的是,我有一个 JList,其中包含可用驱动器列表,如果用户选择了其中一个驱动器,那么我将显示位于 JTable 中选定驱动器中的所有 html 文件,所以我为我的 JList 放置一个事件监听器,然后创建一个 JTable 并将所有数据放在那里并将其显示在容器中。代码如下所示:

static class HtmlListing implements ListSelectionListener
        {
            public void valueChanged(ListSelectionEvent event) 
            {
              if (!event.getValueIsAdjusting())
              {   //trying to remove and re-add controls in container.
                  EastCont.removeAll(); 

                  globarr = new ArrayList<File>(); // global variable

                  FileListing fl = new FileListing();
                  fl.walk(fileList1.getSelectedValue() + "work\\airasia\\html", 500, 0);    

                  //if(globarr.size() > 0)
                  //{
                       Object[][] data = new Object[globarr.size()][globarr.size()];

                       for(int i = 0; i < globarr.size(); i++)
                       {
                           if(globarr.get(i).isFile())
                           {
                               String filename =  globarr.get(i).getName().toString();
                               String date = sdf.format(globarr.get(i).lastModified());

                               Object[] obj = new Object[] {filename,  filename.substring(filename.lastIndexOf(".") + 1), date, globarr.get(i).getAbsolutePath()};
                               data[i] = obj;
                           }
                       }

                      Object[] column = new Object[]{"name ", "type", "date modified", "path"}; 

                      DefaultTableModel model = new DefaultTableModel(data, column);
                      model.fireTableDataChanged();

                       table =  new JTable(model) 
                       {
                            private static final long serialVersionUID = 1L;

                            public boolean isCellEditable(int row, int column) 
                            {                
                                    return false;               
                            };  
                        };

                       table.addMouseListener(new MouseAdapter()
                       {
                             public void mouseClicked(MouseEvent e)
                             {
                                  if (e.getClickCount() == 2)
                                  {
                                      int rowIdx = table.getSelectedRow(); // path to your new file
                                      TableModel tm = table.getModel();
                                      String path =  tm.getValueAt(rowIdx, 3).toString(); 
                                      File htmlFile = new File(path);

                                      try // open the default web browser for the HTML page
                                      {
                                          Desktop.getDesktop().browse(htmlFile.toURI());
                                          //Desktop.getDesktop().open(htmlFile);
                                      } 
                                      catch (IOException e1) 
                                      {
                                            // TODO Auto-generated catch block
                                            e1.printStackTrace();
                                      }
                                  }
                             }
                        });

                       table.removeColumn(table.getColumnModel().getColumn(3)); //hide column path from display
                       table.setFillsViewportHeight(true);
                       table.setIntercellSpacing(new Dimension(0, 5));
                       table.setShowGrid(false);

                       scrollPane = new JScrollPane(table);

                       EastCont = new JPanel();
                       EastCont.setLayout(new BorderLayout());
                       EastCont.add(scrollPane);
                       EastCont.setPreferredSize(new Dimension(1050, 1000));

                       //EastCont.repaint();
                       //EastCont.revalidate();

                       gui.add(EastCont, BorderLayout.EAST);
                       gui.revalidate();
                       gui.repaint();  
                // }
                // else                
                // {
                //     EastCont.remove(table);
                //     gui.remove(EastCont);
                //     gui.revalidate();
                //     gui.repaint();
                // } 
            }    

此代码仅适用于第一次,但不适用于第二次等等,那么我在这里错过了什么?任何帮助都会很棒。谢谢。

最佳答案

DefaultTableModel model = new DefaultTableModel(data, column);
//model.fireTableDataChanged();
//table =  new JTable(model) 
table.setModel( model );

不要创建新表更改重置当前表的模型。该方法中的其余代码也不是必需的,因为您没有创建任何新的 GUI 组件。

此外,切勿调用 fireXXX 方法。这是 TableModel 的职责。

关于java - 为什么具有 DefaultTableModel 的 JTable 不会刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19582043/

相关文章:

java - JFrame 的默认关闭操作不起作用

java - jTextField颜色问题。 jTable 中也不显示颜色

java - JTable 将 boolean 值渲染为 JToggleButton

java - 如何在多线程应用程序中获取作业执行持续时间的准确时间戳?

java - 尝试使用 java/javafx 在 intellij 上启动并运行 Maven

带有垂直文本的 java swing 单选按钮

Java 和 JFrame "NoClassDefFoundError"

java - 如何重新绘制/再次调用paintComponent?

java - 在运行时更改 jTable 模型

java - 用于存储键值对的轻量级数据库类库