我有一个由向量填充的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");
}
}
答案 0 :(得分:1)
您可以使用更复杂的表模型实现,而不是使用向量来填充表,而是允许您直接使用File
个对象作为表中的行。我在谈论DataObjectTableModel或Rob Camick的RowTableModel。
因此,假设您已解决表模型实现,并且表中的每一行都是File
对象。现在,我不会让任何单元格可编辑,让表格只显示文件信息,考虑到:
TableModel
的责任。TableModelListener
完成,但是一旦模型发生变化就会触发事件,因此如果您在更新HD中的文件名时遇到麻烦,则必须恢复表模型的更改。虽然不是那么容易。为了重新命名文件,我会在表格中附加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())
}
});