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

时间:2010-11-12 17:47:22

标签: java swing

我希望用户只从现有文件中选择文件,并且不想让他输入文件名 那么我们如何禁用 JFileChooser 中的文件输入字段? 谢谢。

4 个答案:

答案 0 :(得分:8)

我认为您真正想要的是让用户选择现有文件。

您可以为JFileChooser编写一个动作侦听器来检查并确保该文件存在。

您仍然希望用户能够输入文件输入字段,以便限制JFileChooser中显示的内容,

例如,如果用户键入*.txt,则仅显示.txt个文件。如果用户键入one*,则仅显示以字母o-n-e开头的文件。

答案 1 :(得分:6)

完全同意吉尔伯特。 但在奇怪的情况下,如果你真的想要你所要求的: 该文本字段在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(); }

}

答案 2 :(得分: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;
}

答案 3 :(得分: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;
}