Java 当我在while循环中单击按钮时,如何进入下一个迭代?

Java 当我在while循环中单击按钮时,如何进入下一个迭代?,java,swing,while-loop,Java,Swing,While Loop,我正在做测验。我将问题存储在数组中。因此,我使用while循环逐个显示问题。当我点击按钮时,计数器+1并转到下一个迭代,这是下一个问题。然而,它似乎不起作用 final int[] k = {0}; while (k[0] <2){ ql.setText(qa[k[0]][0]); ql.setVisible(true); for (int l = 0; l < 4; l++) { ch[l].setVisible(true);

我正在做测验。我将问题存储在数组中。因此,我使用while循环逐个显示问题。当我点击按钮时,计数器+1并转到下一个迭代,这是下一个问题。然而,它似乎不起作用

final int[] k = {0};
while (k[0] <2){
    ql.setText(qa[k[0]][0]);
    ql.setVisible(true);

    for (int l = 0; l < 4; l++) {
        ch[l].setVisible(true);
        ch[l].setText(String.valueOf((int) (50 * Math.random())));
    }
    rc = (int) (4 * Math.random());
    ch[rc].setText(qa[k[0]][1]);

    nx.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            k[0]++;
        }
    });
}

final int[]k={0};

虽然(k[0]您的代码存在许多问题,但最基本的问题(关注您的问题)是您误解了代码中循环之间的区别(例如,
for
)GUI事件循环。代码中的循环先执行,然后完成。GUI事件循环等待用户执行某个操作,然后再响应该操作。在继续之前,不希望让代码循环等待某个用户操作:GUI不是这样工作的


我建议您阅读swing教程中关于编写事件侦听器的部分:。它解释了如何让代码正确响应用户触发的事件。

您必须反转循环才能以事件驱动的方式工作。因此,我认为,您应该让按钮单击驱动“循环”因为它只会在你的计数器没有用完的情况下激活问题,否则它只会忽略更多的按下

比如:

private void showQuestion(int question) {
    ql.setText(qa[question][0]);
    ql.setVisible(true);

    for (int l = 0; l < 4; l++) {
        ch[l].setVisible(true);
        ch[l].setText(String.valueOf((int) (50 * Math.random())));
    }
    int rc = (int) (4 * Math.random());
    ch[rc].setText(qa[question][1]);
}

...
// In some method...
nx.addActionListener(new ActionListener() {
    int nextQuestion = 1;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (k < 1) {
            showQuestion(nextQuestion++);
        }
    }
});
showQuestion(0); // Shows the first question
private void showQuestion(整数问题){
ql.setText(qa[问题][0]);
ql.setVisible(true);
对于(int l=0;l<4;l++){
ch[l].setVisible(真);
ch[l].setText(String.valueOf((int)(50*Math.random()));
}
int rc=(int)(4*Math.random());
ch[rc].setText(质询][1]);
}
...
//在某种程度上。。。
addActionListener(新的ActionListener(){
int nextQuestion=1;
@凌驾
已执行的公共无效操作(操作事件e){
if(k<1){
showQuestion(nextQuestion++);
}
}
});
showQuestion(0);//显示第一个问题

为什么
k
int[]
而不是
int
?如果要移动到循环的下一个迭代,可以使用
continue
。是的,因为它定义为
int[]k={0};
这是一个只有一个元素的数组。我认为,actionlistener如何与循环交互也有一个基本的误解。理论上,一旦代码编译,它将添加许多操作侦听器,它将循环,直到操作触发两次,并在每次迭代中添加另一个侦听器。不过,我不知道它将如何进行rks在实践中是无效的。可能正如您所说:它不起作用。也许您想要的是在循环之外创建侦听器。@AnilM,您无法在java中有效地修改闭包内部的最终变量。因此,使用单个值的数组通常是人们的工作方式this@ScaryWombat,如果仔细看,它实际上是
qa[k[0]][1]
这意味着此行正在访问一个名为
qa
@smac89的多维数组。你说得太对了。但是我必须先按下按钮,然后进入第一个问题。我总共有十个问题。所以你基本上显示第一个问题,然后每次单击按钮都会显示以下问题。谢谢!