当前位置: 首页 > 面试题库 >

Java:等待用户在旋转窗口上输入

凌善
2023-03-14
问题内容

因此,大约一个星期前,我开始学习Java,我正在编写的一个小程序遇到一些问题,这些程序是我为使用swing和oop / java进行训练而编写的。

该程序(到目前为止)具有MainClass和Window类。MainClass创建Window类的实例,该实例创建JFrame并将用户输入保存在field中。

此时,MainClass将输出输出,这是通过getters方法获得的。

问题在于,我仍然以一种过程性的方式思考:MainClass输出null,因为它不等待窗口的位置来获取用户输入。

我该如何解决它,从而使主体在打印之前等待窗口的状态接受用户输入?

Nb。Jframe的东西起作用了,出现了窗口,只是MainClass不等待它完成应有的工作。我可以(我认为吗?)使用一些sleep命令来等待,但这似乎是完全错误的。

这是MainClass.java的代码

import java.util.Arrays;

public class MainClass {

    private char[] password;
    private String pin;

    public static void main(String[] args) {

        Window w = new Window();    
        System.out.println(w.getPin() + Arrays.toString(w.getPassword()) + '1');
    }


}

和Window.java

import java.awt.*;
import javax.swing.*;
import java.awt.Window.Type;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import net.miginfocom.swing.MigLayout;


public class Window extends JFrame{

    private JTextField textField_1;
    private JButton btnNewButton;
    private JPanel panel;
    private JPasswordField passwordField;
    private char[] password = new char[10];
    private String pin;


    public Window() {

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setSize(370, 150);
        this.setForeground(new Color(192, 192, 192));
        this.setTitle("Access Password Manager");
        this.setResizable(false);

        panel = new JPanel();
        getContentPane().add(panel, BorderLayout.CENTER);
        panel.setLayout(new MigLayout("", "[70.00][132.00,grow][44.00][67.00,grow][61.00][]", "[19.00][34.00][]"));

        JLabel lblNewLabel = new JLabel("Password");
        panel.add(lblNewLabel, "cell 0 1,alignx trailing,aligny center");

        passwordField = new JPasswordField();
        passwordField.setColumns(13);
        panel.add(passwordField, "cell 1 1,alignx center");

        JLabel lblNewLabel_1 = new JLabel("Key");
        panel.add(lblNewLabel_1, "cell 2 1,alignx center,aligny center");

        textField_1 = new JTextField();
        panel.add(textField_1, "cell 3 1,alignx left,aligny center");
        textField_1.setColumns(4);

        btnNewButton = new JButton("Log In");
        ListenForButton listener = new ListenForButton();

        btnNewButton.addActionListener(listener);
        panel.add(btnNewButton, "cell 4 1");

        this.setVisible(true);

    }

        private class ListenForButton implements ActionListener{


            @Override
            public void actionPerformed(ActionEvent e) {

                if(e.getSource() == btnNewButton){

                    if (passwordField.getPassword().length < 10){

                        password = passwordField.getPassword().clone();   
                    }

                    pin = textField_1.getText();

                }
            }       
        }


        public char[] getPassword(){            
            return password;            
        }

        public String getPin(){
            return pin;     
        }


}

编辑:

这不仅仅与打印有关,我知道我可以直接对Window.class进行处理。如果我自己解释得不好,我很抱歉。请考虑println为“一旦窗口将其保存为输入,我就需要访问和处理这些字段”。


问题答案:

您可以使用模式对话框来获取用户输入,该对话框将在可见时阻止代码执行,并在不可见时继续执行代码(这是不可思议的),有关更多信息,请参见如何制作对话框。

更新

模态对话框将仅阻止“事件调度线程”(从技术上讲不会阻止它,只是绕过它),有关更多详细信息,请参见初始线程。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import net.miginfocom.swing.MigLayout;

public class MainClass {

    private char[] password;
    private String pin;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                System.out.println("Before Window");
                Window w = new Window();
                System.out.println("After Window");
                System.out.println(w.getPin() + Arrays.toString(w.getPassword()) + '1');
            }
        });
    }

    public static class Window extends JDialog {

        private JTextField textField_1;
        private JButton btnNewButton;
        private JPanel panel;
        private JPasswordField passwordField;
        private char[] password = new char[10];
        private String pin;

        public Window() {

            this.setModal(true);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setLocationRelativeTo(null);
            this.setSize(370, 150);
            this.setForeground(new Color(192, 192, 192));
            this.setTitle("Access Password Manager");
            this.setResizable(false);

            panel = new JPanel();
            getContentPane().add(panel, BorderLayout.CENTER);
            panel.setLayout(new MigLayout("", "[70.00][132.00,grow][44.00][67.00,grow][61.00][]", "[19.00][34.00][]"));

            JLabel lblNewLabel = new JLabel("Password");
            panel.add(lblNewLabel, "cell 0 1,alignx trailing,aligny center");

            passwordField = new JPasswordField();
            passwordField.setColumns(13);
            panel.add(passwordField, "cell 1 1,alignx center");

            JLabel lblNewLabel_1 = new JLabel("Key");
            panel.add(lblNewLabel_1, "cell 2 1,alignx center,aligny center");

            textField_1 = new JTextField();
            panel.add(textField_1, "cell 3 1,alignx left,aligny center");
            textField_1.setColumns(4);

            btnNewButton = new JButton("Log In");
            ListenForButton listener = new ListenForButton();

            btnNewButton.addActionListener(listener);
            panel.add(btnNewButton, "cell 4 1");

            this.setVisible(true);

        }

        private class ListenForButton implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (e.getSource() == btnNewButton) {

                    if (passwordField.getPassword().length < 10) {

                        password = passwordField.getPassword().clone();
                    }

                    pin = textField_1.getText();

                }
            }
        }

        public char[] getPassword() {
            return password;
        }

        public String getPin() {
            return pin;
        }

    }
}


 类似资料:
  • 问题内容: 我正在尝试制作一个暂停用户输入的简单命令。我认为在Bash脚本中它将很有用。 这是我的代码: 它甚至不会暂停供用户输入。 我之前尝试过使用getch()(ncurses)。发生的是,屏幕变黑了,当我按下一个键时,它又回到了原来的屏幕上,我看到了: 这是我想要的。但是我想要的只是DOS / Windows 中的命令(我使用Linux)。 问题答案: 从GNU C库手册: 函数:char

  • 我正在编写一个棋盘游戏,我需要检查玩家正在移动的敌人并提示进行攻击。但是,由于游戏是如何制作的,移动方法是在JavaFX应用程序线程上调用的,我希望能够提示用户是否要与敌人战斗。 我的对话框工作正常,使用等待和通知,在主线程上不工作,会导致程序崩溃,有人知道如何暂停这个线程的执行,直到用户单击其中一个按钮。 我为描述道歉,太晚了。 检查敌人的方法该方法检查敌人,如果用户选择是,则返回敌人。它运行在

  • 我正在尝试为我的频道制作IRC机器人。我希望机器人能够从控制台接收命令。为了让主循环等待用户输入内容,我添加了循环: 这似乎不起作用。我听说过BufferedReader,但我从未使用过,也不确定这是否能解决我的问题。

  • 问题内容: 我正在使用Java的扫描仪读取用户输入。如果我仅使用nextLine一次,那就可以了。使用两个nextLine时,第一个不会等待用户输入字符串(第二个会输入)。 输出: X:Y :(等待输入) 我的密码 任何想法为什么会发生这种情况?谢谢 问题答案: 您可能像以前那样调用方法。这样的程序是这样的: 演示您所看到的行为。 问题是不消耗,因此下一个调用将消耗它,然后等待读取的输入。 您需要

  • 我在寻找一种方法来等待一个窗口弹出,你不知道的名字。我在找这样的东西:

  • 我有最简单的Java应用程序,只是工作,如果从命令行执行。但是,如果我想通过IntelliJ IDEA 14终极调试它,部分总是返回,而不必输入任何内容: 这是Windows 8.1的某种问题还是与IntelliJ IDEA有关? 更新:我发现这个问题只有在通过Gradle(gradlew run)启动应用程序时才会出现,所以这是一个Gradle问题。这是我的: