我希望用户只从现有文件中选择文件,并且不想让他输入文件名 那么我们如何禁用 JFileChooser 中的文件输入字段? 谢谢。
答案 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;
}