Как отключить поле ввода файла в JFileChooser? - PullRequest
2 голосов
/ 12 ноября 2010

Я хочу, чтобы пользователь выбирал файлы только из существующих файлов, и не хочу, чтобы он вводил имя файла.
Так как же мы можем отключить поле ввода файла в JFileChooser ?
Спасибо.

Ответы [ 4 ]

8 голосов
/ 12 ноября 2010

Я думаю, что вы действительно хотите, чтобы пользователь выбрал существующий файл.

Вы бы написали прослушиватель действий для JFileChooser, чтобы проверить и убедиться, что файл существует.

Вы по-прежнему хотите, чтобы пользователь мог печатать в поле ввода файла, чтобы он мог ограничивать то, что отображается в JFileChooser,

Например, если пользователь вводит *.txt, отображаются только .txt файлы. Если пользователь вводит one*, отображаются только файлы, начинающиеся с букв o-n-e.

6 голосов
/ 13 ноября 2010

Полностью согласен с Гилбертом. Но в нечетном случае, если вы действительно хотите то, что просили: Это текстовое поле определено внутри реализации plaf, и вы можете использовать, скажем, отражение, чтобы получить и изменить его, или вы можете попытаться перебрать все дочерние компоненты, надеясь, что единственная JTextArea - это та, которую вы ищете. В следующем примере используется отражение и работает для внешнего вида металла:

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;</p> <p>public class FileChooser {</p> <p>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(); }</p> <p>}

3 голосов
/ 13 ноября 2010

Вы можете пройти иерархию дочерних компонентов (как упоминал Юрий). Вот функция для поиска 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 голосов
/ 13 мая 2011

Это расширение к решению, опубликованному по адресу 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...