Не удается автоматически выбрать панель JOption showInputDialog - PullRequest
0 голосов
/ 04 ноября 2018

Итак, у меня есть JOptionPane, как это в самом начале моего основного метода:

JFrame frame = new JFrame("Input");
String progName = JOptionPane.showInputDialog(frame, "Name?");

Однако, прежде чем я смогу начать печатать, мне нужно вручную нажать на всплывающее окно. Есть ли способ сделать так, чтобы, как только я запустил программу, она автоматически «выбрала» всплывающее окно, так что, когда я начну печатать, она просто окажется в текстовом поле. Если это не может быть сделано с JOptionPane, я в порядке с другими альтернативами, мне просто нужно получить введенную пользователем строку с учетом вышеуказанных ограничений.

1 Ответ

0 голосов
/ 04 ноября 2018

Я создал простой пример, в котором логика запроса имени пользователя сосредоточена в одном методе. Этот метод вызывается в самом начале приложения и каждый раз, когда вы нажимаете кнопку.

Таким образом, пользователь вынужден вводить данные при запуске приложения и каждый раз, когда он / она желает изменить введенное значение.

public class Jf53136132 extends JFrame {

    private static final long serialVersionUID = -3336501835025139522L;

    private JPanel contentPane;



    public Jf53136132() {
        setTitle("Jf53136132");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);

        JButton btnInvokeJoptionpane = new JButton("set some text on label");
        panel.add(btnInvokeJoptionpane);

        JLabel lblx = new JLabel("-x-");
        panel.add(lblx);

        getNewTextForLabel(lblx);

        btnInvokeJoptionpane.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                getNewTextForLabel(lblx);
            }
        });
    }



    private void getNewTextForLabel(JLabel label) {
        String inputText = JOptionPane.showInputDialog("Enter the text for the label");
        System.out.println("you entered <" + inputText + ">");
        if (inputText != null && !inputText.trim().isEmpty()) {
            label.setText(inputText);
        }
    }

}

Обратите внимание, как вызывается метод getNewTextForLabel (...), как только метка добавляется на панель содержимого и при каждом нажатии кнопки.

Кроме того, как правильно указал VGR, рекомендуется не запускать какой-либо код Swing внутри основного потока приложения. Вы можете взглянуть на учебники по Java для свинга ( вот классический пример ).

Ниже приведен пример кода, который запускает фрейм в отдельном потоке.

public class Main {

    private static void createAndShowGUI() {
        Jf53136132 f = new Jf53136132();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setPreferredSize(new Dimension(640, 480));
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }



    void execute() {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }



    public static void main(String[] args) {
        new Main().execute();
    }

}
...