Java Swing: как заставить setFileFilter() работать за пределами каталога, для которого установлен FileChooser

У меня есть функция openFileAction(), которая вызывается, когда я нажимаю «Файл» > «Открыть» в моем JMenuBar. Его первые строки выглядят так:

private static String myPath = ... // some path

private void openFileAction() {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setCurrentDirectory(new File(myPath));
    
    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
        File f = null;
        try {
            fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
            fileChooser.setFileFilter(new FileNameExtensionFilter(null, ".txt");
            f = fileChooser.getSelectedFile();
            ...

Я хочу видеть только .txt файлы в качестве предложений, поэтому я вызываю setFileFilter() на свой fileChooser.

Это отлично работает для каталога fileChooser, myPath -- то есть в появившемся всплывающем окне «Открыть» я вижу только .txt файлы (и папки) в этом каталоге. Однако, если я перехожу от myPath во всплывающем окне, скажем, к Desktop, я вижу там файлы (и папки) все, а не только файлы .txt, как хотелось бы.

Как я могу видеть только файлы .txt в любом каталоге, в который я перехожу?

Настройте диалог перед звонком fileChooser.showOpenDialog(this)

MadProgrammer 04.05.2022 01:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, настройте диалог так, как вы хотите, прежде чем показывать его, поэтому вместо...

JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(myPath));

if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
    File f = null;
    try {
        fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        fileChooser.setFileFilter(new FileNameExtensionFilter(null, ".txt");
        f = fileChooser.getSelectedFile();

Вы должны делать что-то более похожее на...

JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(myPath));
fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
fileChooser.setFileFilter(new FileNameExtensionFilter(null, ".txt");

if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
    File f = null;
    try {
        f = fileChooser.getSelectedFile();

Во-вторых, правильно настройте FileFilter. Вы должны дать ему какое-то «описание», так как это предоставляется пользователю, и вам не нужен . в расширении, вместо этого он должен быть больше похож на...

fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt");

Запускаемый пример...

import java.awt.EventQueue;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Test {
    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                File myPath = new File(".");
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setCurrentDirectory(myPath);
                fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
                fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt"));

                if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    System.out.println("You have selected " + selectedFile);
                }
            }
        });
    }
}

Я бы также подумал о том, чтобы присмотреться к Как использовать средства выбора файлов

Ах да, конечно ... Это сработало как шарм, я принял ответ :) И да, точка перед расширением была ошибкой, которую я уже уловил, но она вернулась.

rdv 04.05.2022 15:48

Другие вопросы по теме