gpt4 book ai didi

java - 改变 JFileChooser 行为 : preventing "choose" on enter in file path JTextField

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:57 24 4
gpt4 key购买 nike

问候 Swing 专家,这是一个很好的(我希望)问题。

以下是我看到的任务要求和可能的解决方案。我希望有过如此核心经验的人分享一些对此的想法。

这不需要编码或类似的东西,我只需要一般建议,关于我需要使用的事实,哪种方法更可靠驻留在 sun.swing 和/或 javax.swing.plaf 包中的私有(private) 符号。

任务是修改/更改 JFileChooser 行为(实际上只是一点点)。

  1. 当用户在文件名 JTextField 中按下回车键,并且该字段包含指向目录的路径时,不要“选择”该目录,而是切换到该目录。是的,对话框被配置为接受目录,但我们只需要接受点击“打开”按钮,以及(可能)在文件列表中双击。

  2. 防止用户通过在文件名文本字段中按回车键选择包含超过 1GB 数据的目录/文件

这里有几个通用的解决方案选项:

一个。监听 JFileChooser 提供的基于属性的更改(AFAICS 是事后触发的,不会提供我们在这里需要的控制程度)。

修补 javax.swing.plaf.basic.BasicFileChooserUI(通过反射,破坏私有(private)级封装)并更改对

的引用
private Action approveSelectionAction = new ApproveSelectionAction();

以便我们的自定义操作对 1 和 2 进行额外检查。此方法与 plaf 包链接,如果此 UI 类下的某个类以某种方式覆盖此操作,则可能会失败。

遍历 JFileChooser 组件层次结构,找到 JTextField(它显然应该在组件树中只出现一次),用我们的自定义检查装饰卡在该 JTextField 上的所有 Action 监听器。我的调试 session 显示此 JTextField 是 JTextField 的某个匿名子类,位于 sun.swing.FilePane 中。这种方法似乎对 OO 更友好,但对于某些操作系统,此文本字段可能不存在,或者其他一些 JTextField 也存在于层次结构中。

好吧,公共(public) JFileChooser API 似乎不足以实现该行为,而其他两个选项要么很神奇,要么不可移植(长期),甚至两者兼而有之。

那么,问题是:您会选择哪种方法,为什么?

最佳答案

关于option2,不需要使用反射来自定义accept Action。您可以只覆盖 approveSelection() 方法。像这样的东西:

JFileChooser chooser = new JFileChooser( new File(".") )
{
public void approveSelection()
{
if (getSelectedFile().exists())
{
System.out.println("duplicate");
return;
}
else
super.approveSelection();
}
};

关于java - 改变 JFileChooser 行为 : preventing "choose" on enter in file path JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4232275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com