Используйте JFileChooser без использования основного объявления

Следуя моему предыдущему сообщению по этой ссылке У меня другая проблема.

Учитывая следующий код:

public class GuiHandler extends javax.swing.JFrame {

// GuiHandler is the class that runs the entire project 
// here are two private fields that I use in the code , I have more but they
// irrelevant for the moment 

final JFileChooser openFiles = new JFileChooser();
private DataParser xmlParser = new DataParser();


// later on I have this method - XMLfilesBrowserActionPerformed


private void XMLfilesBrowserActionPerformed(java.awt.event.ActionEvent evt) {                                                

       //setting the file chooser
    openFiles.setFileSelectionMode(JFileChooser.FILES_ONLY);
    openFiles.setAcceptAllFileFilterUsed(false);
    if (openFiles.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
        //getting the selected file
        File selected = openFiles.getSelectedFile();

// from here I parse the XML file that I opened with JFileChooser 
// with the help of one of my methods getNodeListFromFile
xmlParser.getNodeListFromFile(selected);

Проблема в том, что я не могу использовать объявление main, которое было предложено ранее в приведенной выше ссылке (и я должен добавить, что это было довольно приятно:)), опубликованный код:

public class NativeFileChooser {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                } catch(Exception e) {
                    e.printStackTrace();
                }
                JFileChooser jfc = new JFileChooser();
                jfc.showOpenDialog(null);
            }
        });
    }
}

А использование main очень затрудняет дальнейшую работу с файлом XML с помощью моего метода getNodeListFromFile.

Что мне нужно, так это использовать «простой» браузер JFileChooser, а затем использовать выбранный файл, не вовлекая в это main.

Я был бы признателен, если бы кто-нибудь объяснил, как я могу использовать приведенный выше код (или что-то еще) с моим кодом.

С наилучшими пожеланиями

ИЗМЕНИТЬ:

Если я использую такой код ;

  public void launchFileChooser() {

     SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
            } catch(Exception e) {
                e.printStackTrace();
            }
            JFileChooser jfc = new JFileChooser();
            jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
            jfc.setAcceptAllFileFilterUsed(false);
            if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
                 newFile = jfc.getSelectedFile();

        }
    });

  }

здесь newFile является элементом данных.

затем после открытия файла происходит сбой кода.

Если я сделаю jfc элементом данных, код откроет обычный браузер. Любая идея, как это исправить?

Спасибо


person JAN    schedule 06.06.2012    source источник
comment
1) Класс GUI обычно не должен расширять JFrame, вместо этого код должен просто сохранять экземпляр одного. 2) Кадр в коде, показанном в принятом ответе, будет Metal PLAF (он создается до изменения PLAF), что может выглядеть странно в вашем приложении. 3) Каков вариант использования здесь? Кажется, вы хотите, чтобы JFileChooser отображалось перед основным графическим интерфейсом, и чтобы основной графический интерфейс никогда не должен был открывать второй XML. Это правильно? 4) Чтобы быстрее получить помощь, опубликуйте SSCCE (как я разместил и как упоминает akf).   -  person Andrew Thompson    schedule 06.06.2012


Ответы (2)


Я уверен, что код был просто автономным примером.

Вы должны каким-то образом превратить JFileChooser в свой GuiHandler. Во всяком случае, вы можете добавить этот код в метод инициализации вашего GuiHandler

public class GuiHandler extends javax.swing.JFrame {

  //lots of your other code
  public void launchFileChooser() {
     SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
            } catch(Exception e) {
                e.printStackTrace();
            }
            JFileChooser jfc = new JFileChooser();
            jfc.showOpenDialog(null);
        }
    });
  }

  public static void main(String[] args) {
     GuiHandler handler = new GuiHandler();
     handler.launchFileChooser();
  }
}
person akf    schedule 06.06.2012
comment
Спасибо . Есть ли способ заставить браузер показывать только .xml файлов? - person JAN; 06.06.2012
comment
Вы можете создать подкласс FileFilter и позаботиться об этом самостоятельно. Взгляните на эту ссылку: docs.oracle.com/javase /tutorial/uiswing/components/ - person akf; 06.06.2012
comment
лучше добавить новый вопрос, а не добавлять к этому. (и при этом, пожалуйста, уточните, что означает «сбой кода» - есть ли исключения? - person akf; 06.06.2012
comment
Да, xception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: File cannot be null, и после нажатия open file программа показывает это исключение в console, пока моя программа работает, затем я выбираю свой файл xml, а затем ничего не происходит, то есть код не анализирует файл xml, как обычно. - person JAN; 06.06.2012
comment
Обратите внимание, что сам кадр по-прежнему будет металлическим PLAF, если не будет вызван updateComponentTree... Может быть, а может и не быть проблемой здесь, я все еще не совсем уверен в требуемом конечном результате. +1 за замечание Я уверен, что код был просто автономным примером. Точно. :) - person Andrew Thompson; 06.06.2012

Объявите любой другой класс или используйте класс JFrame и делегируйте вызов JFileChooser для него либо путем объявления нового класса/интерфейса, либо там самого, на самом деле нет смысла вызывать JFileChooser из метода Main

person Abhishek Choudhary    schedule 06.06.2012
comment
Если я удалю main из опубликованного кода, он не скомпилируется. - person JAN; 06.06.2012
comment
не удаляйте код, я просто говорю о том, чтобы не добавлять JFileChooser в основной класс, создавать новый класс из класса пользовательского интерфейса, и там вы делаете все необходимое, почему ваш основной класс должен нести ответственность за создание FileCHooser - person Abhishek Choudhary; 06.06.2012