我正在使用JFileChooser作为JTable单元的编辑器。我希望用户使用JFileChooser选择有效文件,然后当他们按Enter键时,文件路径将保存到单元格中。如果他们想要清除细胞,则会出现问题。所以我希望他们清除JFileChooser,然后用空字符串设置单元格(或者为null,无论哪个)。
我的问题是,如果您没有选择文件,则无法按“批准”按钮。在我的代码中,“空!”永远不会打印。有没有办法在没有选择文件时允许选择批准按钮?这是我尝试过的:
JFileChooser component = new JFileChooser(){
public void approveSelection(){
File f = getSelectedFile();
if(f==null){
System.out.println("empty!");
return;
}else{
if(!f.exists()){
System.out.println("does not exist!");
}else{
super.approveSelection();
}
}
}
};
答案 0 :(得分:4)
您可能有兴趣覆盖JFileChooser cancelSelection()方法,该方法在用户取消选择文件时调用。
使用JFileChooser选择空文件名进行JTable单元格清除可能不直观且用户友好。最好在JTable单元旁边有一个小按钮,以便在用户单击它时清除单元格值或任何其他选项来重置单元格值,并仅使用JFileChooser来更改单元格中的文件路径。
答案 1 :(得分:1)
当你运行你提供的代码时,如果没有选择文件,它甚至都没有进入approveSelection处理程序。在内部,有代码来防止空选择。此行为来自BasicFileChooserUI的ApproveSelectionAction方法,该方法检查如果文件名为null,则返回而不在选择器上调用approveSelection,因此JFileChooser永远不会收到按下“Accept”的通知。这是一个非常丑陋的函数,所以即使你找到了一种方法来访问它,改变行为也会很棘手。
解决此问题的几种可能途径:
1)您可以将JFileChooser嵌入到另一个组件中,并显示父组件。然后,您可以将JFileChooser和自定义按钮添加到同一面板,并为自定义按钮添加按钮处理。自定义按钮可以处理希望不选择任何内容的用户。这篇文章可能会给出一些提示:JFileChooser embedded in a JPanel
2)您可能滥用JFileChooser的“附件”功能。通常它“用于”显示文件类型的预览,但由于它采用任意组件,因此没有理由你不能在那里添加自己的“无文件”按钮,并设置一个监听器,并关闭对话框如果按下该按钮并将通知发送到您的表格单元格,它应该是一个空白值。相对容易。
3)你可以尝试破解JFileChooser对话框,在Save and Cancel旁边添加一个额外的按钮。这可能不是很容易,你可能不得不做一些棘手的工作来找到取消按钮并向其父级添加另一个按钮。如果你是一名java专家,可能只有可行。
4)您可以创建某种“假”/特殊文件,如果选中,则会对正常处理进行例外处理并显示空白文件名而不是真实文件名。
答案 2 :(得分:0)
我想知道你是否可以编写一个扩展JFileChooser的类,并修改文本字段,以便清除它不会禁用Accept按钮。