Выбор файла и папки Java Swing

#java #swing #jframe #jfilechooser

#java #swing #jframe #jfilechooser

Вопрос:

Привет, я новичок в swing, и мне нужна некоторая помощь. Я создал проект обработки файлов, в котором я читаю входной файл и некоторые другие существующие файлы в проекте, выполняю множество проверок и синтаксического анализа и создаю csv и xlsx-файл. До сих пор я использовал для этих входных данных

 JTextField csvpath = new JTextField();
    JTextField csvfile = new JTextField();
    JTextField xmlpath = new JTextField();
    JTextField xmlfile = new JTextField();
    JTextField excpath = new JTextField();
    JTextField excfile = new JTextField();
    Object[] message = {
        "Enter the path of the CSV file to be created:", csvpath,
        "Enter the CSV file name:", csvfile,
        "Now enter the XML path to be read:", xmlpath,
        "Also enter the XML file name:", xmlfile,  
        "Please enter the Excel file path to be created:", excpath,
        "Finally enter the Excel file name:", excfile     
    };

    int option = JOptionPane.showConfirmDialog(null, message, "Convert XML File to CSV File", JOptionPane.OK_CANCEL_OPTION);
    if (option == JOptionPane.OK_OPTION) {
        String csvPath = csvpath.getText();
        String csvFileName = csvfile.getText();
        String xmlPath = xmlpath.getText();
        String xmlFileName = xmlfile.getText();
        String excPath = excpath.getText();
        String excFileName = excfile.getText();
        String FullcsvPath = csvPath   "\"   csvFileName   ".csv";
        String FullxmlPath = xmlPath   "\"   xmlFileName   ".xml";
        String excelPath = excPath   "\"   excFileName   ".xlsx";
            .
            .
        parsing/creating starts...
  

Поскольку в будущем этот проект будут использовать другие, я хотел создать средство выбора файлов и получать пути к файлам / папкам в виде строк, чтобы считывать входные данные и создавать etc…
Я создал класс и общедоступные строки для путей, и когда я вызываю его, программа не останавливается, как раньше, продолжает выполняться, пока фрейм открыт, без получения нужных путей. Мой новый класс — это:

 public static void SelectFiles() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {

    final JFrame window = new JFrame("Parse for manufacturers - Developed by Aris M");
    JPanel topPanel = new JPanel();
    JPanel midPanel = new JPanel();
    JPanel botPanel = new JPanel();
    final JButton openFolderChooser = new JButton("Select Folder to save csv - xlsx results");
    final JButton openFileChooser = new JButton("Select the File to be parsed");
    final JButton closeButton = new JButton("OK");
    window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    final JFileChooser fc = new JFileChooser();

    openFolderChooser.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            fc.setCurrentDirectory(new java.io.File("user.home"));
            fc.setDialogTitle("This is a JFileChooser");
            fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            if (fc.showOpenDialog(openFolderChooser) == JFileChooser.APPROVE_OPTION) {
                JOptionPane.showMessageDialog(null, fc.getSelectedFile().getAbsolutePath());
                System.out.println(fc.getSelectedFile().getAbsolutePath());
                csv = fc.getSelectedFile().getAbsolutePath();
                xlsx = csv;
                System.out.println(csv);                    
            }                
        }
    });
    openFileChooser.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            fc.setCurrentDirectory(new java.io.File("user.home"));
            fc.setDialogTitle("This is a JFileChooser");
            fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
            if (fc.showOpenDialog(openFileChooser) == JFileChooser.APPROVE_OPTION) {
                JOptionPane.showMessageDialog(null, fc.getSelectedFile().getAbsolutePath());
                System.out.println(fc.getSelectedFile().getAbsolutePath());
                xml = fc.getSelectedFile().getAbsolutePath();
                System.out.println(xml);  
            }
        }
    });
    closeButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {   
                window.dispose();              
        }
    });
    window.add(BorderLayout.NORTH, topPanel);
    window.add(BorderLayout.CENTER, midPanel);
    window.add(BorderLayout.SOUTH, botPanel);
    topPanel.add(openFolderChooser);
    midPanel.add(openFileChooser);
    botPanel.add(closeButton);
    window.setSize(500, 150);
    window.setVisible(true);
    window.setLocationRelativeTo(null);            
}
  

Комментарии:

1. Не могли бы вы объяснить, что вы подразумеваете под «программа не останавливается, как раньше»?

2. Как именно вы вызываете метод SelectFiles()? Я не понимаю смысла рендеринга JFrame таким образом

3. @devmind с помощью JOptionPane я могу поместить строки, нажать кнопку ok, и затем программа продолжится…

4. @SebVb выбираем_файлы_swing. SelectFiles(); внутри основного.

Ответ №1:

Код Swing выполняется в отдельном потоке, известном как поток отправки событий. Просто сделайте ваш основной поток занятым, пока виден фрейм. Добавьте следующий код в конец SelectFiles() метода:

         while (window.isVisible()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }