在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时,我得到一个空值。造成这些差异的原因可能是什么?
答案 0 :(得分:4)
相同值之间出现这种差异的原因是什么?
您可以拥有两个相同类型的对象,一个显示,其状态正在更改,另一个未显示您正在检查if块。
但同样,为了获得更好的帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。我们不希望看到您的整个程序,而是您应该将代码压缩到仍然编译的最小位,没有与您的问题无关的额外代码,但仍然可以证明您的问题。顺便说一句,你永远不会想要像你一样使用带有JButton的MouseListener。而是使用ActionListener,因为它是为它构建的。
答案 1 :(得分:3)
"我已经在登录按钮中添加了一个mouselistener" - 不是一个好主意,按钮应该使用ActionListener
,请参阅{{ 3}}和How to Write an Action Listeners;
while(display.loginPage.username==null){
是一个非常糟糕的想法,可能会锁定您的用户界面,并暗示您违反了Swing的单线程规则。有关详细信息,请参阅How to Use Buttons, Check Boxes, and Radio Buttons。
你需要的是一个模态对话框,它可以在对话框可见时阻止代码的执行......
有关详细信息,请参阅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实际上是可以监听的,并且返回了更好定义的登录页面对象(不可见)的预期结果。