当前位置: 首页 > 知识库问答 >
问题:

JFrame-等待用户按下按钮

易炳
2023-03-14

我目前正在开发一个聊天程序的登录表单,希望该程序加载框架并等待用户输入。不可饶恕的是,程序打开了框架,但同时又恢复了主方法。我希望你有一些想法来帮助我。

问候语

public static void main(String[] args){  

        boolean running = true;  

        //Starting JFrame
        chatFrame.loginFrame(); 

            //Processing - Receiving Status from Login method
            if(getStatus() == 1){  

                ... 
            } else { 
                System.out.println("An Error occured.."); 
                System.exit(0); 
            }

        }

JFrame类:

public class chatFrame{ 

    private static String sLogin;  
    private static String password; 


    public static void loginFrame(){ 
        System.out.println("Launching Frame"); 
        JFrame loginFrame = new JFrame();
        loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

        JTextField user = new JTextField("Username");
        JTextField pass = new JTextField("Password");
        JButton login = new JButton("Login");

        loginFrame.setLayout(new BorderLayout());
        loginFrame.add(user, BorderLayout.NORTH);
        loginFrame.add(pass, BorderLayout.CENTER);
        loginFrame.add(login, BorderLayout.SOUTH);

        loginFrame.pack();  
        loginFrame.setSize(250, 150);
        loginFrame.setVisible(true);   

            login.addActionListener(new ActionListener(){ 

                public void actionPerformed(ActionEvent e){
                    System.out.println("Action performed"); 
                    String sLogin = user.getText();  
                    String password = pass.getText(); 

                    //Calling Login method
                    ClEngine.login(sLogin, password);
                    System.out.println("dataIn:" + dataIn);
                    loginFrame.setVisible(false);
                } 
            });   
    } 
}

共有1个答案

阎坚成
2023-03-14

您希望等待用户完成应用程序窗口工作的响应,有几种可能的方法来解决这一问题。我推荐的最简单的方法是使登录窗口成为一个模式JDialog,而不是一个JFrame。这样,当对话框可见时,调用程序的程序流将停止,一旦对话框关闭,调用程序的程序流将恢复,然后它可以查询对话框的状态,并找出是否输入了数据,以及是否为有效数据。

另一种选择是允许外部类向登录窗口添加侦听器,比如向其按钮添加ActionListener,或者添加WindowListener,但这处理起来稍微复杂一些。

例如:

import java.awt.Window;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.*;

public class ChatLogin extends JPanel {
    private static JDialog dialog;
    private static ChatLogin chatLogin;
    private static boolean loginValid;
    private JTextField userNameField = new JTextField(10);
    private JPasswordField passwordField = new JPasswordField(10);

    public ChatLogin() {
        JPanel inputPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(2, 10, 2, 2);
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        inputPanel.add(new JLabel("User Name:"), gbc);

        gbc.gridy = 1;
        inputPanel.add(new JLabel("Password:"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.EAST;
        gbc.insets = new Insets(2, 2, 2, 2);
        inputPanel.add(userNameField, gbc);

        gbc.gridy = 1;
        inputPanel.add(passwordField, gbc);

        JPanel btnPanel = new JPanel(new GridLayout(1, 0, 2, 2));
        btnPanel.add(new JButton(new LoginAction()));

        setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
        setLayout(new BorderLayout());
        add(inputPanel, BorderLayout.CENTER);
        add(btnPanel, BorderLayout.PAGE_END);
    }

    public String getUserName() {
        return userNameField.getText();
    }

    public char[] getPassword() {
        return passwordField.getPassword();
    }

    public static boolean isLoginValid() {
        return loginValid;
    }

    private class LoginAction extends AbstractAction {
        public LoginAction() {
            super("Login");
            putValue(MNEMONIC_KEY, KeyEvent.VK_L);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            loginValid = true;
            Window win = SwingUtilities.getWindowAncestor(ChatLogin.this);
            win.dispose();
        }
    }

    public static JDialog getInstance(Window win, String title) {
        dialog = new JDialog(win, title, ModalityType.APPLICATION_MODAL) {
            @Override
            public void setVisible(boolean b) {
                loginValid = false;
                super.setVisible(b);
            }
        };
        chatLogin = new ChatLogin();
        dialog.add(chatLogin);
        dialog.pack();
        dialog.setLocationRelativeTo(win);
        return dialog;
    }

    public static JDialog getInstance() {
        if (dialog == null) {
            return getInstance(null, "Login");
        } else {
            return dialog;
        }
    }

    public static ChatLogin getChatLoginInstance() {
        return chatLogin;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            ChatLogin.getInstance().setVisible(true);
            if (ChatLogin.isLoginValid()) {
                ChatLogin chatLogin = ChatLogin.getChatLoginInstance();
                String userName = chatLogin.getUserName();
                String password = new String(chatLogin.getPassword()); // not a safe thing to do

                // here test that user name and password are valid
                System.out.println("user name: " + userName);
                System.out.println("Password:  " + password);
            }
        });
    }

}
 类似资料:
  • 多亏了这里有用的回复,我的图形用户界面达到了我想要的效果-- 这是GUI,这是添加了ActionListener的当前代码: 我读过一些关于使用JOptionPane的文章,但显然这并没有给我想要的灵活性,因为我不仅想要按钮,还想要两个标签和文本区域。 基本上,我想做的是: 我希望执行停止,直到我选择按下Button1或Button2。我不想做等待(),因为这可能是糟糕的性能。 谢谢你的帮助!

  • 问题内容: 我希望脚本等待用户按下任何键。 我怎么做? 问题答案: 在 Python 3中 使用: 在 Python 2中 使用: 不过,这仅等待用户按下Enter键。 可能要使用 msvcrt ((仅Windows / DOS)使用 msvcrt 模块可以访问Microsoft Visual C / C ++运行时库(MSVCRT)中的许多功能): 这应该等待按键。 附加信息: Python 3

  • 想改进这个问题吗 通过编辑此文章,添加详细信息并澄清问题。 当计数器小于3并且我等待单击按钮时,我想一直更改循环颜色。当循环是红色时,他需要按“停止”。这是程序: 非常感谢。

  • 我创建了一个用于登录,我想在按钮“cont nou”被按下后用jpanel为新帐户打开一个新窗口,但不知道如何用jpanel将初始帧消失和出现。你有什么想法吗?谢谢你!这就是我到现在所做的: 这是,其登录名为:

  • 问题内容: 我有一个登录框架,我必须从另一个线程等待。成功登录后,框架将自行处置。我想弹出该应用程序的主框架。现在,我正在观看一个布尔值,以确定何时启动主机。正确的做法是什么?观看布尔值只是感觉并不优雅。 问题答案: 如果您有Java 5或更高版本,则可以使用CountDownLatch。例如,假设主框架最初处于控制状态,则让主框架创建一个倒数为1的,然后将此锁存器传递给登录框架。然后让主机等待锁

  • 我有一个Jframe窗口,里面有一个按钮。通过单击该按钮,它将打开一个新的JFrame窗口。但是当我关闭这个窗口时,它会自动用按钮关闭第一个Jframe窗口。当我关闭第二个Jframe窗口时,如何防止第一个Jframe窗口关闭?