寻求帮助再次为家庭作业找出一些东西 . 我已经完成了大部分工作,但是我很难理解为什么我不能让for-loop等待用户文本输入 . 基本上,我需要程序提示用户输入记忆中的颜色 . 颜色作为字符串包含在数组中 . 在for循环的每次迭代中,我都希望动作监听器检查并查看是否输入了正确的文本 . 如果是这样,该框应该将它的JLabel文本从“输入颜色编号x”更改为“输入颜色编号x 1”
这就是我注意到的事情:我的for循环贯穿整个迭代循环,甚至考虑让用户在文本中键入文本 . 因此,它不是提示用户输入颜色编号1,而是直接将颜色编号为5 .
这是我得到的代码:
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class ColorGame extends JFrame
{
private static final int WIDTH = 300;
private static final int HEIGHT = 200;
//Text field that will confirm a user submission
private JTextField colorEntry = new JTextField(10);
private int colorIndex = 0; //current index of colorSequence
//String Array of colors to be searched for and validated in a text field
private String[] colorSequence = {"red", "white", "yellow", "green", "blue"};
public ColorGame()
{
setTitle("Memory Game");
setSize(WIDTH, HEIGHT);
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
createContents();
setVisible(true);
}
public void createContents()
{
//dialog box to inform user of program's purpose
JOptionPane.showMessageDialog(null, "How good is your memory?\nTry to memorize "
+ "this color sequence:\n\nred, white, yellow, green, blue");
//JLabel to prompt user for color
JLabel colorPrompt = new JLabel();
add(colorPrompt);
add(colorEntry);
for(int i = 0; i < colorSequence.length; i++)
{
colorIndex = i + 1;
colorPrompt.setText("Enter color number " + colorIndex + ":");
colorEntry.addActionListener(new Listener());
}
}
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String colorText = "";
colorText = colorEntry.getText();
if(colorText.equals(colorSequence))
System.out.println("Hello");
else
System.out.println("No");
}
}
public static void main(String[] args)
{
new ColorGame();
}
}
2 回答
你的for循环是逐行运行命令行程序的代码,但这不是事件驱动的GUI的工作方式 .
相反,您希望ActionListener中的代码推进计数器并根据该计数器更改行为 .
for循环将立即循环而不关心用户's input or for when a button has been pressed. The key is that you want to alter your program' s state ,具体取决于按下JButton的次数 . 而且由于按下按钮会触发状态变化,因此无需担心某些循环循环太快 .
这是一个相关的例子,不是一个确切的解决方案,但应该给你一些解决方案的想法:
基本上,我最终弄清楚我不需要在createContents()中重复我的动作,并且我的动作会通过监听器重复 . 您对事件驱动编程的评论对我有所帮助 .