Как дождаться завершения события, прежде чем программа продолжит работу в java - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь получить путь, используя JFileChooser , а затем продолжаю выполнение программы. Сначала появляется рамка и предлагает пользователю нажать кнопку. Когда кнопка нажата, появляется окно JFileChooser , чтобы пользователь мог выбрать каталог.

Проблема заключается в следующем: при нажатии кнопки программа не ждет, пока пользователь выберет каталог, хотя появляется окно JFileChooser . Он переходит к следующей команде и выдает исключение NullPointerException. Чтобы выяснить это, я добавил метод promtENTERKey , поэтому программа останавливается и ожидает нажатия клавиши «ENTER».

Все хорошо, но я не хочу нажимать клавишу «ВВОД». Я хочу, чтобы программа продолжала после , когда пользователь выбирает каталог, не нажимая ничего. Я проверил похожие вопросы, но не смог сделать это. Я новичок в java (конечно, я получил много помощи для своего кода). Есть идеи?

Мой код выглядит следующим образом:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class DirChooser extends JPanel implements ActionListener {

    JButton button;
    static JFileChooser chooser = null;

    public DirChooser() {
        button = new JButton("Select Directory");
        button.addActionListener (this);
        add(button);
    }

    public static void main (String [] args) {

        String path = getDir();

        // ... code ...

    }

    public static String getDir() {

        String dir = null;
        JFrame frame = new JFrame("");
        DirChooser panel = new DirChooser();
        frame.addWindowListener(
                new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                }

            );
        frame.getContentPane().add(panel,"Center");
        frame.setSize(panel.getPreferredSize());
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        promtENTERKey();  

        dir = chooser.getSelectedFile().getAbsolutePath();
        frame.dispose();    
        return dir;
    }

    public Dimension getPreferredSize(){

        return new Dimension(200, 100);
    }

    public void actionPerformed (ActionEvent e) {

        chooser = new JFileChooser (); 
        chooser.setCurrentDirectory (new java.io.File("."));
        chooser.setDialogTitle ("choose directory");
        chooser.setFileSelectionMode (JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed (false); // disable the "All files" option.

        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
            System.out.println ("\n" + "Directory has been selected");
        }
        else {
            System.out.println("No Selection ");
        }
    }

    public static void promtENTERKey() {

        System.out.println("\n" + "Select directory first and then press \"ENTER\" to continue...");
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();
    }
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Обычно я думаю, что следующее действие должно быть начато с вашего слушателя действия. Чтобы соответствовать предлагаемой платформе, мы можем сделать блокировку обратного отсчета для блокировки вместо использования сканера.

CountDownLatch latch = new CountDownLatch(1);
public void actionPerformed (ActionEvent e) {
    //code to choose file.
    latch.countDown();
}

Теперь вы можете заменить youre getEnter на

latch.await();
0 голосов
/ 01 февраля 2020

Показывает ли следующее mre , что вы пытаетесь достичь?

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

public class DirChooser {

    private static String path;

    public static void main (String [] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Select Directory");
        button.addActionListener (e-> {
            path = getDir();
            System.out.println ("File chooser returned Path: " + path);
        });

        frame.add(button);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    public static String getDir() {

       JFileChooser chooser = new JFileChooser ();
       chooser.setCurrentDirectory (new java.io.File("."));
       chooser.setDialogTitle ("choose directory");
       chooser.setFileSelectionMode (JFileChooser.DIRECTORIES_ONLY);
       chooser.setAcceptAllFileFilterUsed (false); // disable the "All files" option.
       int returnVal = chooser.showOpenDialog(null);
       if (returnVal == JFileChooser.APPROVE_OPTION)
           return chooser.getSelectedFile().getAbsolutePath();
       return null;
    }
}
...