Ant*_*n K 5 java swing jfilechooser look-and-feel
向Swing Pros致以问候,这是一个很好的(我希望)问题.
以下是我看到的任务要求和可能的解决方案.我想有人有这样的铁杆经验来分享一些关于这个的想法.
这不需要编码或类似的东西,我只需要一般性建议,关于我需要使用驻留在sun.swing和/或javax.swing.plaf包中的私有符号的事实,哪种方法更可靠.
任务是修改/改变JFileChooser行为(实际上只是一点点).
当用户在文件名JTextField中按Enter键,并且该字段包含dir的路径时,不要"选择"目录,而是切换到它.是的,对话框配置为接受目录,但我们只需要接受"打开"按钮的点击,并且(可能)双击文件列表表.
通过在文件名文本字段中输入,阻止用户选择数据超过1GB的目录/文件
以下是一些常规解决方案选项:
一个.聆听JFileChooser提供的基于属性的更改(事后触发哪个AFAICS,并且不会提供我们需要的控制程度).
湾 修改javax.swing.plaf.basic.BasicFileChooserUI(通过refrection,打破私有级封装)并修改引用
private Action approveSelectionAction = new ApproveSelectionAction();
Run Code Online (Sandbox Code Playgroud)
这样我们的自定义操作就会对1和2进行额外检查.这种方法与plaf包链接,如果在此UI类下面的某个类中以某种方式覆盖此操作,则可能会失败.
C.遍历JFileChooser组件层次结构,找到JTextField(显然应该只在组件树中出现一次),使用我们的自定义检查装饰挂在JTextField上的所有动作侦听器.我的调试会话显示这个JTextField是生活在sun.swing.FilePane中的JTextField的一些匿名子类.这种方法似乎更友好,但是对于某些操作系统来说,这个文本字段可能不存在,或者其他一些JTextField也存在于层次结构中.
好吧,似乎公共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();
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2250 次 |
| 最近记录: |