Making a JFileChooser select the text of the file name but not the extension
Asked Answered
A

3

8

I'd like the text in the file name field of the JFileChooser save dialog to select just the file name and not the extension.

I currently have this:

What it currently looks like

And want it to look like this:

Ideally what it'd look like

This is a simple change, but one that makes saving a file much easier, in my opinion, since the user can start typing the file name right away without erasing the extension accidentally.

I know I can forcefully add the extension if it's missing, but I'd rather not do this because the extension isn't mandatory and I don't feel it should be enforced.

So, is there any way I could achieve this?

Applewhite answered 14/6, 2013 at 7:21 Comment(1)
I don't know the answer but it is a good question, I will look at see what I can find.Daybook
S
2

The API does not offer that directly but one simple way to do it is to scan the component hierarchy, looking for a JTextField and then change the selection of that textfield.

Here is an example of that solution:

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();
            }
        });
    }
}
Snip answered 14/6, 2013 at 7:52 Comment(1)
A bit heavier than I was hoping for, but it works like a charm. Thanks!Applewhite
F
0

it seems that it's not possible to configure this on the default component,

i guess you'll have to extend it, this tutorial will help you :

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

Fredenburg answered 14/6, 2013 at 7:36 Comment(1)
Please avoid posting Link-only answers. This is not very helpful and your link may get broken at some point, loosing all the relevant information.Snip
O
0

I believe you can write a custom JFileChooser by extending com.sun.java.swing.plaf.windows.WindowsFileChooserUI and override its setFileName() method.

Olodort answered 14/6, 2013 at 7:50 Comment(2)
But the user seems to be on Linux (from the L&F of his screenshot). Anyway, that's not portable at all. I would not go down that road.Snip
@GuillaumePolet Yes you are right. Its not portable and will be useful only if on Windows OS.Olodort

© 2022 - 2024 — McMap. All rights reserved.