Java: 在JFileChooser 中,如何在双击file/folder 时停止显示绝对文件路径?
Java: In JFileChooser, how to stop showing absolute file path when double-clicking on file/folder?
红框显示的是用户双击文件夹目录时出现完整文件路径的问题。
有时文本字段包含太长的完整文件路径(例如,打开的文件夹嵌套在文件夹之间很深),从而遮挡了文件名。其他时候,当用户保存文件时,可以保存文件,文件名与文本字段中的内容一样长,在这种情况下,文件路径作为文件名。
如何摆脱这种行为?
更改行为的方法如下:
首先,您需要使用此方法来搜索 JFileChooser 中的所有组件:
@SuppressWarnings("unchecked")
private JList<Class<?>> findFileList(Component comp){
if (comp instanceof JList){
return (JList<Class<?>>) comp;
}
if (comp instanceof Container){
for (Component c : ((Container) comp).getComponents()){
JList<Class<?>> list = findFileList(c);
if (list != null){
return list;
}
}
}
return null;
}
接下来,我们需要从所有组件的JList中找到所有可用的MouseListener,并将它们全部移除。某些 MouseListeners 可能会注册双击并影响文本字段显示其文本的方式。这将有助于删除所有影响 MouseListeners 的因素。
但是删除 MouseListeners 也会影响 JFileChooser 处理打开文件的方式。我们需要自己处理这个动作。这是执行此操作的简单方法。
final JFileChooser opener = new JFileChooser();
JList<Class<?>> list = findFileList(opener);
LOOP_TEMP1: for (MouseListener l : list.getMouseListeners()){
if (l.getClass().getName().indexOf("FilePane") >= 0){
list.removeMouseListener(l);
list.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1){
File file = opener.getSelectedFile();
if (file != null){
BasicFileChooserUI ui = (BasicFileChooserUI) opener.getUI();
ui.setFileName(file.getName());
}
}
else if (e.getClickCount() == 2){
File file = opener.getSelectedFile();
if (file != null){
if (file.isDirectory()){
opener.setCurrentDirectory(file);
}
else if (file.isFile()){
opener.setSelectedFile(file);
}
BasicFileChooserUI ui = (BasicFileChooserUI) opener.getUI();
ui.setFileName(file.getName());
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
});
break LOOP_TEMP1;
}
}
现在,只要用户双击 folder/directory,JFileChooser 将不再在文本字段中显示长文件路径。现在看起来好多了。您可能需要自己处理双击后打开的文件。
希望这对您有所帮助!
红框显示的是用户双击文件夹目录时出现完整文件路径的问题。
有时文本字段包含太长的完整文件路径(例如,打开的文件夹嵌套在文件夹之间很深),从而遮挡了文件名。其他时候,当用户保存文件时,可以保存文件,文件名与文本字段中的内容一样长,在这种情况下,文件路径作为文件名。
如何摆脱这种行为?
更改行为的方法如下:
首先,您需要使用此方法来搜索 JFileChooser 中的所有组件:
@SuppressWarnings("unchecked")
private JList<Class<?>> findFileList(Component comp){
if (comp instanceof JList){
return (JList<Class<?>>) comp;
}
if (comp instanceof Container){
for (Component c : ((Container) comp).getComponents()){
JList<Class<?>> list = findFileList(c);
if (list != null){
return list;
}
}
}
return null;
}
接下来,我们需要从所有组件的JList中找到所有可用的MouseListener,并将它们全部移除。某些 MouseListeners 可能会注册双击并影响文本字段显示其文本的方式。这将有助于删除所有影响 MouseListeners 的因素。
但是删除 MouseListeners 也会影响 JFileChooser 处理打开文件的方式。我们需要自己处理这个动作。这是执行此操作的简单方法。
final JFileChooser opener = new JFileChooser();
JList<Class<?>> list = findFileList(opener);
LOOP_TEMP1: for (MouseListener l : list.getMouseListeners()){
if (l.getClass().getName().indexOf("FilePane") >= 0){
list.removeMouseListener(l);
list.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1){
File file = opener.getSelectedFile();
if (file != null){
BasicFileChooserUI ui = (BasicFileChooserUI) opener.getUI();
ui.setFileName(file.getName());
}
}
else if (e.getClickCount() == 2){
File file = opener.getSelectedFile();
if (file != null){
if (file.isDirectory()){
opener.setCurrentDirectory(file);
}
else if (file.isFile()){
opener.setSelectedFile(file);
}
BasicFileChooserUI ui = (BasicFileChooserUI) opener.getUI();
ui.setFileName(file.getName());
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
});
break LOOP_TEMP1;
}
}
现在,只要用户双击 folder/directory,JFileChooser 将不再在文本字段中显示长文件路径。现在看起来好多了。您可能需要自己处理双击后打开的文件。
希望这对您有所帮助!