使JFileChooser选择文件名的文本而不是扩展名

时间:2013-06-14 07:21:44

标签: java swing jfilechooser

我希望JFileChooser保存对话框的文件名字段中的文本只选择文件名而不是扩展名。

我目前有这个:

What it currently looks like

希望它看起来像这样:

Ideally what it'd look like

这是一个简单的更改,但在我看来,这样可以更轻松地保存文件,因为用户可以立即开始输入文件名而不会意外删除扩展名。

我知道如果缺少扩展名,我可以强行添加扩展名,但我不想这样做,因为扩展名不是强制性的,我觉得不应该强制执行。

那么,有什么办法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:2)

API不直接提供,但一种简单的方法是扫描组件层次结构,查找JTextField,然后更改该文本字段的选择。

以下是该解决方案的示例:

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TestJFileChooser {

    public TestJFileChooser() {

    }

    protected void initUI() {
        JFrame frame = new JFrame(TestJFileChooser.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JButton button = new JButton("Click me");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                chooser.setSelectedFile(new File(chooser.getCurrentDirectory(), "save.dat"));
                final JTextField textField = getTexField(chooser);
                if (textField != null) {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            String text = textField.getText();
                            if (text != null) {
                                int index = text.lastIndexOf('.');
                                if (index > -1) {
                                    textField.setSelectionStart(0);
                                    textField.setSelectionEnd(index);
                                }
                            }
                        }
                    });
                }
                chooser.showSaveDialog(button);
            }

            private JTextField getTexField(Container container) {
                for (int i = 0; i < container.getComponentCount(); i++) {
                    Component child = container.getComponent(i);
                    if (child instanceof JTextField) {
                        return (JTextField) child;
                    } else if (child instanceof Container) {
                        JTextField field = getTexField((Container) child);
                        if (field != null) {
                            return field;
                        }
                    }
                }
                return null;
            }
        });
        frame.add(button);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestJFileChooser fc = new TestJFileChooser();
                fc.initUI();
            }
        });
    }
}

答案 1 :(得分:0)

似乎无法在默认组件

上配置它

我想你必须扩展它,本教程将帮助你:

https://today.java.net/pub/a/today/2007/02/22/how-to-write-custom-swing-component.html

答案 2 :(得分:0)

我相信您可以通过扩展com.sun.java.swing.plaf.windows.WindowsFileChooserUI并覆盖其setFileName()方法来编写自定义JFileChooser。