变量在同一范围内调用时会生成多个值java

时间:2014-12-20 03:28:32

标签: java swing jbutton mouselistener

在Java Swing桌面应用程序中。我有一些较小的类,所有这些都是在一个总体的App类中使用的。其中一个较小的类是代表我的登录页面的JPanel。我已经在此页面的登录按钮上添加了一个mouselistener,这样就可以了:

Public class loginPage extends JPanel{
String username;
boolean capturedName=false;
JTextField nameField;

...

loginButton.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    username = nameField.getText(); 
                    capturedName=true;    //for redundant checking of mouse click event
                    System.out.println(username);    //error checking
                    System.out.println(capturedName);    //error checking
                }
            });
    }

在一个代表我的JFrame的单独的显示类中,我使登录页面成为所述类的属性,并在我的app类中添加登录页面之后实例化该显示类。我试图在App类中捕获登录页面用户名attr并将其传递给其他方法。但是,当我运行代码并单击登录按钮时,文本框中的值不会被捕获。

要进行错误检查,我尝试了ff:

//Set login page GUI up 

while(display.loginPage.username==null){ //this is initially true

        if (display.loginPage.capturedName){  //boolean to check if button has been clicked
            display.loginPage.username=display.loginPage.nameField.getText(); //intentional redundancy
            String username=display.loginPage.username; 
            System.out.print(username);
            //pass username to other methods
        }

        }

当我运行代码时,在用户名文本字段中输入一个名称,然后单击login,打印出类型名称和captureName布尔值的真值,但是

if (display.loginPage.capturedName)

条件永远不会实现。另外,当我添加print display.loginPage.username时,我得到一个空值。造成这些差异的原因可能是什么?

3 个答案:

答案 0 :(得分:4)

  

相同值之间出现这种差异的原因是什么?

您可以拥有两个相同类型的对象,一个显示,其状态正在更改,另一个未显示您正在检查if块。

但同样,为了获得更好的帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。我们不希望看到您的整个程序,而是您应该将代码压缩到仍然编译的最小位,没有与您的问题无关的额外代码,但仍然可以证明您的问题。顺便说一句,你永远不会想要像你一样使用带有JButton的MouseListener。而是使用ActionListener,因为它是为它构建的。

答案 1 :(得分:3)

  1. "我已经在登录按钮中添加了一个mouselistener" - 不是一个好主意,按钮应该使用ActionListener,请参阅{{ 3}}和How to Write an Action Listeners;

  2. while(display.loginPage.username==null){是一个非常糟糕的想法,可能会锁定您的用户界面,并暗示您违反了Swing的单线程规则。有关详细信息,请参阅How to Use Buttons, Check Boxes, and Radio Buttons

  3. 你需要的是一个模态对话框,它可以在对话框可见时阻止代码的执行......

    有关详细信息,请参阅Concurrency in Swing

    使用MVC paridigm(How to Make Dialogs)查看Java and GUI - Where do ActionListeners belong according to MVC pattern?以获取“登录”对话框/表单的示例

答案 2 :(得分:0)

正如@MadProgrammer建议的那样,我在我的显示类中创建了两个不同的loginPage对象。然而,令人好奇的是,登录页面GUI上的mouselistener实际上是可以监听的,并且返回了更好定义的登录页面对象(不可见)的预期结果。