JFileChooser:设置名称文本字段未启用

时间:2019-01-18 10:02:46

标签: java swing jfilechooser

我正在使用JFileChooser来让用户保存文件。 但是我不希望用户选择一个名称来保存文件。名称文本字段必须未启用。

我阅读了文档,但没有找到这样的方法或属性。

1 个答案:

答案 0 :(得分:1)

乌贼评论中,建议您一个好的解决方案。但是,如果仍然要禁用文本字段,因此文件的名称对用户可见(对于JFileChooser.DIRECTORIES_ONLY,它是 not ),则可以使用以下代码来“抢”选择器中的文本字段并将其禁用。

import java.awt.Component;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TextFieldFromFileChooser {
    public TextFieldFromFileChooser() {
        JFileChooser chooser = new JFileChooser();
        JTextField fileChooserTextField = getFileChooserTextField(chooser);
        fileChooserTextField.setText("I name this file.txt");
        fileChooserTextField.setEditable(false);
        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            // Selected file has the name of the fileChooserTextField' text
            System.out.println(chooser.getSelectedFile().getAbsolutePath());
        }
    }

    private static JTextField getFileChooserTextField(JFileChooser chooser) {
        JTextField f = null;
        for (Component c : getComponents(chooser)) {
            if (c instanceof JTextField){
                f = (JTextField) c;
                break;
            }
        }
        return f;
    }

    private static List<Component> getComponents(JComponent component) {
        List<Component> list = new ArrayList<>();
        for (Component c : component.getComponents()) {
            if (c instanceof JPanel)
                list.addAll(getComponents((JPanel) c));
            else if (c instanceof JTextField)
                list.add((JTextField) c);
        }
        return list;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new TextFieldFromFileChooser());
    }
}

请注意,这已经在Windows LAF和Java的股票LAF中进行了测试。如果您的选择器有2个文本字段(我不知道在MAC / linux上如何),则可能有问题,因为您不知道禁用了哪些文本字段。