如何在JFileChooser中禁用文件输入框?

3

我希望用户只能从现有的文件中选择文件,而不允许他输入文件名。
那么我们如何在JFileChooser中禁用文件输入字段?
谢谢。

4个回答

8
我认为您真正想要的是让用户选择现有文件。
您可以编写一个动作监听器来检查并确保文件存在于JFileChooser中。
您仍然希望用户能够在文件输入字段中输入,以便他可以限制在JFileChooser中显示的内容,
例如,如果用户键入“*.txt”,则只显示“.txt”文件。 如果用户键入“one*”,则只显示以字母o-n-e开头的文件。

7
完全同意Gilbert的观点。 但在极少数情况下,如果您确实需要您所请求的内容: 该文本字段定义在plaf实现内部,您可以使用反射来获取并更改它,或者您可以尝试遍历子组件,希望唯一的JTextArea是您正在寻找的那个。以下示例使用反射,并适用于Metal外观:

import java.awt.Frame;
import java.lang.reflect.Field;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.plaf.metal.MetalFileChooserUI;

public class FileChooser {
    public static void main(String[] args) throws Exception{
        Frame f = new JFrame();
        JFileChooser jFileChooser = new JFileChooser();
        MetalFileChooserUI ui = (MetalFileChooserUI)jFileChooser.getUI();
        Field field = MetalFileChooserUI.class.getDeclaredField("fileNameTextField");
        field.setAccessible(true);
        JTextField tf = (JTextField) field.get(ui);
        tf.setEditable(false);
        tf.setEnabled(false);
        jFileChooser.showDialog(f, "Select");
        f.dispose();
    }
}

太棒了!这正是我想做的(我有一个名为“全部导出”的选项,对应于列表中的项目,因此它们已经有了它们的名称,我只想选择文件夹)。 - Ericson Willians

3

你可以遍历子组件层次结构(就像Yuriy提到的那样)。 以下是在组件层次结构中查找JTextField的函数。 它会找到第一个JTextField(希望需要的文本字段是FileChooser中唯一的一个)。

{
    JFileChooser fc = new JFileChooser();
    disableTF(fc);
}

public boolean disableTF(Container c) {
    Component[] cmps = c.getComponents();
    for (Component cmp : cmps) {
        if (cmp instanceof JTextField) {
            ((JTextField)cmp).setEnabled(false);
            return true;
        }
        if (cmp instanceof Container) {
            if(disableTF((Container) cmp)) return true;
        }
    }
    return false;
}

2

这是对http://www.mikepot.com/1493.html中解决方案的扩展。

不同之处在于单击被转换为双击。这在Ubuntu下似乎效果更好,因为双击会被转换成单击。

package com.troyware.inventoryItemManager;

import java.awt.Component;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JList;

/** 
 * This file chooser prevents users from changing file names and thus should facilitate navigating to the correct file 
 * by precluding the user from getting stuck when single clicking a folder name
 * 
 * @author http://www.mikepot.com/1493.html
 * slightly modified by Phil Troy, www.PhilTroy.com, to convert single click into double click
 */
public class MyFileChooser extends JFileChooser
{

    public MyFileChooser()
      { JList list = findFileList(this);
            for (MouseListener l : list.getMouseListeners())
            {   if (l.getClass().getName().indexOf("FilePane") >= 0)
                {   list.removeMouseListener(l);
                    list.addMouseListener(new MyMouseListener(l));
                }
            }
      }

      private JList findFileList(Component comp)
      { if (comp instanceof JList) return (JList)comp;
            if (comp instanceof Container)
            {   for (Component child : ((Container)comp).getComponents())
                {   JList list = findFileList(child);
                    if (list != null) return list;
                }
            }
            return null;
      }

      private class MyMouseListener extends MouseAdapter
      {
        MyMouseListener(MouseListener listenerChain)
        {   m_listenerChain = listenerChain;
        }


        public void mouseClicked(MouseEvent event)
        {   if (event.getClickCount() > 0)
            {   m_listenerChain.mouseClicked(new MouseEvent(event.getComponent(),  event.getID(), event.getWhen(), event.getModifiers(), event.getX(), event.getY(), 2, false)); 
            }
        }

        private MouseListener m_listenerChain;
      }

    private static final long serialVersionUID = 1L;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接