Java 使JFileChooser选择文件名的文本,但不选择扩展名

Java 使JFileChooser选择文件名的文本,但不选择扩展名,java,swing,jfilechooser,Java,Swing,Jfilechooser,我希望JFileChooser保存对话框的文件名字段中的文本只选择文件名,而不是扩展名 我目前有: 希望它看起来像这样: 这是一个简单的更改,但在我看来,它使保存文件变得更加容易,因为用户可以立即开始键入文件名,而不会意外删除扩展名 我知道如果缺少扩展,我可以强制添加,但我不想这样做,因为扩展不是强制性的,我觉得不应该强制执行 那么,有什么方法可以实现这一点吗?似乎无法在默认组件上配置此功能 我想您必须扩展它,本教程将帮助您: 我相信您可以通过扩展com.sun.java.swing.pla

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

我目前有:

希望它看起来像这样:

这是一个简单的更改,但在我看来,它使保存文件变得更加容易,因为用户可以立即开始键入文件名,而不会意外删除扩展名

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


那么,有什么方法可以实现这一点吗?

似乎无法在默认组件上配置此功能

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


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

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();
            }
        });
    }
}
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.File;
导入javax.swing.JButton;
导入javax.swing.JFileChooser;
导入javax.swing.JFrame;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
公共类TestJFileChooser{
公共TestJFileChooser(){
}
受保护的void initUI(){
JFrame=newjframe(TestJFileChooser.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JButton按钮=新JButton(“单击我”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
JFileChooser chooser=新的JFileChooser();
chooser.setSelectedFile(新文件(chooser.getCurrentDirectory(),“save.dat”);
最终JTextField textField=getTexField(选择器);
if(textField!=null){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
String text=textField.getText();
如果(文本!=null){
int index=text.lastIndexOf('.');
如果(索引>-1){
textField.setSelectionStart(0);
textField.setSelectionEnd(索引);
}
}
}
});
}
chooser.showSaveDialog(按钮);
}
私有JTextField getTexField(容器){
对于(int i=0;i
我不知道答案,但这是一个很好的问题,我会看看我能找到什么。但是用户似乎是在Linux上(从他的截图的L&F)。不管怎么说,那根本不是便携式的。我不会走那条路。@GuillaumePolet是的,你是对的。它不可移植,只有在Windows操作系统上才有用。请避免发布。这不是很有帮助,你的链接可能会在某个时候断开,失去所有相关信息。比我希望的要重一点,但它像一个魅力。谢谢