题
在 Swing 应用程序中,只有在用户输入正确答案后,方法才应继续。正确答案存储在一个字符串中,用户答案由侦听器设置为另一个字符串。所以,代码是
while (!correctAnswer.equals(currentAnswer)) {
// wait for user to click the button with the correct answer typed into the textfield
}
// and then continue
这种方法一切都好吗?或者您会以某种方式重构它吗?这不会对CPU造成额外的惩罚吗?这里有一个有点 类似的问题.
解决方案
您新的用户界面编程?我想问的原因是,你的答案是在编码的过程风格,这是不是用户界面是关于预测。它往往是事件驱动的。
在这种情况下,该解决方案是相当容易的:添加一个事件监听器(ActionListener的),以提交按钮,并检查其结果存在。如果OK,继续下去。如果没有,这么说,让他们再试一次。
其他提示
正如其他人所建议的,您需要为按钮分配一个侦听器,按下按钮时将调用该侦听器。
这是一个不完整的示例,说明如何使用 ActionListener
并实施其 actionPerformed
按下按钮时调用的方法:
...
final JTextField textField = new JTextField();
final JButton okButton = new JButton("OK");
okButton.addActionListner(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
if ("some text".equals(textField.getText()))
System.out.println("Yes, text matches.");
else
System.out.println("No, text does not match.");
}
});
...
您可能只想实施 ActionListener
在按钮和文本字段所在的类中,因此您不需要将这两个对象声明为 final
. 。(我只是使用了一个匿名内部类来保持示例简短。)
欲了解更多信息,您可能想看看 如何编写动作监听器 从 Java 教程.
此外,有关 Java 中事件如何工作的一般信息, 课:编写事件监听器 Java 教程中的内容可能会有用。
编辑: 改变了里面的表达方式 if
声明来自 textField.getText().equals("some text")
到 "some text".equals(textField.getText())
为了防止 NullPointerException
如果 textField
曾是 null
, ,根据先生的建议Shiny 和 New 的评论。
我不认为我得到的逻辑存在,但它让我想起了旧的基本次... :-)我不明白为什么该应用程序强制用户键入一些已知的(除非它是一个密码或东西)。
您写打字被听众观察。那么,为什么不去做测试呢?不要做一个循环,等待一个事件,让Java的做(和其他的东西)。如果有必要,打破你的逻辑有两种,并进入第二部分,当你发现正确输入听者给出。
我希望这是有道理的...; - )
是的,大家都在这里说。
有关的GUI的应用程序来处理用户输入的最好的方法是等待要触发的事件。
那么可以使用一种方法来验证输入,如果成功,你可以用流继续,这可能是去到另一个页面。
这里的一个登录屏幕,用于验证所述用户输入的一个完整的(但简单的)示例,并且如果成功,执行某些操作。
此代码具有任何其他值比示出了完整的准备运行样品这个概念是如何应用的。
简单的GUI http://img229.imageshack.us/img229/1532/simplenz0 .PNG
// * used for brevity. Preffer single class per import
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
public class MatchString{
private final JTextField password;
private final JFrame frame;
public static void main( String [] args ){
MatchString.show();
}
public static void show(){
SwingUtilities.invokeLater( new Runnable(){
public void run(){
new MatchString();
}
});
}
private MatchString(){
password = new JPasswordField( 20 );
frame = new JFrame("Go to www.stackoverflow");
init();
frame.pack();
frame.setVisible( true );
}
private void init(){
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new JPanel(){{
add( new JLabel("Password:"));
add( password );
}});
// This is the key of this question.
// the password textfield is added an
// action listener
// When the user press enter, the method
// validatePassword() is invoked.
password.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent e ) {
validatePassword();
}
});
}
private void validatePassword(){
// If the two strings match
// then continue with the flow
// in this case, open SO site.
if ( "stackoverflow".equals(password.getText())) try {
Desktop.getDesktop().browse( new URI("http://stackoverflow.com"));
frame.dispose();
} catch ( IOException ioe ){
showError( ioe.getMessage() );
} catch ( URISyntaxException use ){
showError( use.getMessage() );
} else {
// If didn't match.. clear the text.
password.setText("");
}
}
}
如果您的字符串从GUI利率人类用户的到来,还有在性能优化非常小的点。人类将无法进入,或许比每秒一到三串多了,那也没什么的机器。
在这种特殊情况下,你需要做的东西来获得输入测试,我会建议使用do-while
循环。