微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的布尔值会被抢先返回?

如何解决为什么我的布尔值会被抢先返回?

我正在开发一个登录验证器,并有一个检查用户名和密码有效性的类。检查后,在LoginProxy类中更新了一个布尔变量(isValidLoginCredentials),可以通过get方法获取,用于其他目的。但是,get 方法返回的值始终是我在创建类时分配给 isValidLoginCredentials 的认值。我认为问题是我在有机会更新 isValidLoginCredentials 之前调用了 main() 中的 getter 方法,但我不明白我应该做哪些更改来阻止这种情况。这里是类和主程序的相关部分。

import struct
...
q = int('0x425c0000',16)
b8 = struct.pack('i',q)
dec,= struct.unpack('f',b8)

这里是主要方法

public class LoginProxy implements ActionListener
{
    private JLabel usernameLabel;
    private JTextField usernameText;
    private JLabel passwordLabel;
    private jpasswordfield passwordText;
    private JButton loginButton;
    private boolean isValidLoginCredentials = false;
    
    public void createLogin()
    {
        /*Here was code irrelevant to the problem I removed*/
  

        loginButton.addActionListener(new LoginProxy());
        
        loginButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e) 
            {
                String user = usernameText.getText();//get the username
                String pass = passwordText.getText();//get the password
                String credentials = user +":"+pass;//creates the string I compare to other valid 
                                                    //credentials
                
                ConcreteLoginValidator validator = new ConcreteLoginValidator(credentials);
        
                try 
                {
                    isValidLoginCredentials = validator.checkLogin();
                    System.out.println("The credentials are "+isValidLoginCredentials);
                } 
                catch (FileNotFoundException e1) 
                {
                    e1.printstacktrace();
                }
            
            }
        });
    }

    public void actionPerformed(ActionEvent e) 
    {
        // Todo Auto-generated method stub
        
    }

    public boolean getValidity()
    {
        return isValidLoginCredentials;
    }
    

我应该添加什么才能使 isValidLogin=proxy.getValidity();只有在我已经输入并检查登录凭据是否正确后才返回值?

解决方法

切入正题,快速解决方法是将代码放在下面:

if(isValidLoginCredentials) {
    JFrame frame = MainUI.getInstance();
    frame.setSize(900,600);
    frame.pack();
    frame.setVisible(true);
}

在这部分之后:

System.out.println("The credentials are "+isValidLoginCredentials);

您在 createLogin() 上调用的代码只是将操作侦听器设置为 UI 中的按钮,因此代码将在您单击按钮时执行。 最重要的是,当您打开一个窗口时,它会启动一个单独的线程。我不知道其余的代码,但假设当您实例化 LoginProxy 时,它会打开登录窗口。但是你写的方式,它会打开窗口并立即检查isValidLogin(它不会等你点击按钮)。

如果你想证明这一点,你可以简单地在 proxy.createLogin() 前后放一个 System.out.println。您将意识到在呈现 UI 时将到达这两行。

,

使用一个模态对话框,直到它关闭为止。

非常简单的例子:

public class Dialog {    // LoginProxy in questions code

    private String value = null;
    
    public void show(Window owner) {
        var dialog = new JDialog(owner,JDialog.DEFAULT_MODALITY_TYPE);
        var field = new JTextField(40);

        var okButton = new JButton("OK");
        okButton.addActionListener(ev -> {
            value = field.getText();
            dialog.dispose();
        });

        var panel = new JPanel();
        panel.add(field);
        panel.add(okButton);

        dialog.add(panel);
        dialog.pack();
        dialog.setLocationRelativeTo(owner);
        dialog.setVisible(true);  // this will be blocked until JDialog is closed
    }
    
    public String getValue() {
        return value;
    }
}

喜欢

    public static void main(String[] args) {
        var dialog = new Dialog();
        dialog.show(null);
        System.out.println(dialog.getValue());  // check if valid and open JFrame in questions code
    }

恕我直言,此解决方案的优点:对话框类 (LoginProxy) 不需要知道主类和主 JFrame。它有一个明确的单一功能:请求用户输入。

使用 JOptionPane

更容易创建对话框 ,

为了保证读取另一个线程中写入的值,必须使字段volatile

private volatile boolean isValidLoginCredentials;

您还必须等到对方完成后才能阅读。我留给读者的那个方面。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。