编辑包含文件信息的JTable

时间:2014-12-17 11:54:44

标签: java swing file jtable cell

我有一个由向量​​填充的JTable。这些向量通过循环获取其内容,列出特定文件夹中的所有文件。现在我想编辑一个包含文件名的Cell(通过GUI),HD上的真实文件也应该重命名。那么如何归档呢?

这是填充JTable

的方法的代码
private void reloadFiles(){
    vecVectors.clear();
    if (Variables.pathToFiles != null) {
        Variables.listOfFiles.clear();
        Variables.listOfFiles = listFilesForFolder(Variables.pathToFiles);

        for (File file : Variables.listOfFiles) {
            Vector<String> temp = new Vector<String>();
            temp.add(file.getName());
            vecVectors.add(temp);
        }

        table.removeAll();
        table = new JTable(vecVectors, vecHeaders);

        this.remove(listScroller);
        listScroller.removeAll();
        listScroller = new JScrollPane(table);
        listScroller.setPreferredSize(new Dimension(950, 450));

        this.add(listScroller);

        System.out.println("Reloaded");
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用更复杂的表模型实现,而不是使用向量来填充表,而是允许您直接使用File个对象作为表中的行。我在谈论DataObjectTableModel或Rob Camick的RowTableModel

因此,假设您已解决表模型实现,并且表中的每一行都是File对象。现在,我不会让任何单元格可编辑,让表格只显示文件信息,考虑到:

  1. 有许多因素可能出错(即:文件名无效或存在)
  2. 在HD中反映更新不是TableModel的责任。
  3. 可以使用TableModelListener完成,但是一旦模型发生变化就会触发事件,因此如果您在更新HD中的文件名时遇到麻烦,则必须恢复表模型的更改。虽然不是那么容易。
  4. 为了重新命名文件,我会在表格中附加MouseListener并显示pop up dialog以让用户输入新文件名。最后使用File API到rename the file并更新反映这些更改的表格模型。

    final DataObjectTableModel<File> model = new DataObjectTableModel<File>(header) {
        // Override getValueAt() and getColumnClass() here
    };
    
    final JTable table = new JTable(model);
    table.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
    
            if (e.getClickCount() >= 2 && !e.isPopupTrigger()) {
    
                int selectedRow = table.rowAtPoint(e.getPoint());
    
                if (selectedRow != -1) {
                    String newName = JOptionPane.showInputDialog (
                            null 
                          , "Please input the new name"
                          , "Rename file"
                          , JOptionPane.INFORMATION_MESSAGE
                    );
    
                    if (newName != null) {
                        int modelIndex = table.convertRowIndexToModel(selectedRow);
    
                        File file = model.getDataObject(modelIndex);
    
                        // Maybe this part should be done
                        // using a SwingWorker to avoid blocking the EDT
                        String newPath = file.getParent() + File.separator + newName;
                        File newFile = new File(newPath);
    
                        if (file.renameTo(newFile)) {
                            model.deleteDataObject(modelIndex); // remove the old file
                            model.insertDataObject(newFile, modelIndex); // insert the new file in the same index
                        } else {
                            JOptionPane.showMessageDialog (
                                    null
                                  , "An error happened trying to rename file " + file.getName()
                                  , "Error!"
                                  , JOptionPane.WARNING_MESSAGE
                            );
                        }
                    }
    
                } // if (selectedRow != -1)
    
            } // if (e.getClickCount() >= 2 && !e.isPopupTrigger())
    
        }
    });