【问题标题】:variable when called in the same scope produces multiple values java在同一范围内调用的变量会产生多个值 java
【发布时间】:2015-02-19 00:21:22
【问题描述】:

在 Java Swing 桌面应用程序中。我有许多较小的类,所有这些都在一个总体应用程序类中使用。其中一个较小的类是代表我的登录页面的 JPanel。我在此页面上的登录按钮中添加了一个鼠标侦听器,如下所示:

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 类中捕获登录页面用户名 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
        }

        }

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

if (display.loginPage.capturedName)

条件永远不会满足。此外,当我添加 print display.loginPage.username 时,我得到一个空值。相同值之间出现这种差异的原因可能是什么?

【问题讨论】:

  • 给你的建议(与你的问题无关):类名“loginPage”不是一个好的选择。将其重命名为“登录页面”。 Java 约定类名以大写字母开头,变量以小写字母开头。如果你遵循这个约定,你的代码更容易被其他人理解。
  • 要获得更好的帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。我们不想看到你的整个程序,而是你应该将你的代码压缩成仍然可以编译的最小部分,没有与你的问题无关的额外代码,但仍然可以证明你的问题。顺便说一句,您永远不会想要像您正在做的那样使用带有 JButton 的 MouseListener。而是使用 ActionListener,因为它就是为此而构建的。

标签: java swing jbutton mouselistener


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。我相信您对我可能正在使用 LoginPage 的两个不同实例这一事实是正确的,但在我看来,没有任何迹象表明我的代码中存在这种差异。也许我错了?
【解决方案2】:
  1. “我在登录按钮上添加了一个鼠标监听器” - 不是一个好主意,按钮应该使用ActionListener,参见How to Write an Action ListenersHow to Use Buttons, Check Boxes, and Radio Buttons

  2. while(display.loginPage.username==null){ 是一个非常非常糟糕的主意,它可能会锁定您的 UI 并暗示您违反了 Swing 的单线程规则。详情请见Concurrency in Swing

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

详情请见How to Make Dialogs

查看 Java and GUI - Where do ActionListeners belong according to MVC pattern? 以获取使用 MVC 范式 (Model-View-Controller) 的登录对话框/表单示例

【讨论】:

  • 抱歉,我应该指出我错误地将登录按钮引用为按钮。它提供了这个功能,但它实际上是一个 JLabel,原因是我的同事最熟悉的原因,他实际上写了这部分。鼠标侦听器的相同问题是否适用于 JLabels?
  • 嗯,这引发了可用性问题,因为并非所有用户都使用或可以使用鼠标。但是不,在这种情况下,MouseListener 是您唯一的选择(除了使用正确的按钮)
【解决方案3】:

结果正如@MadProgrammer 所建议的那样,我在我的显示类中创建了两个不同的 loginPage 对象。然而,奇怪的是,登录页面 GUI 上可见的鼠标侦听器实际上进行了侦听,并返回了更好定义的登录页面对象(不可见)的预期结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2011-04-27
    • 2022-07-07
    • 2010-11-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多