Java ActionListener和for循环

Java ActionListener和for循环,java,swing,loops,for-loop,actionlistener,Java,Swing,Loops,For Loop,Actionlistener,亲爱的朋友们: 下面是我想做的: -我想有一个简单的框架与一些按钮和一个JTextArea -我希望有一个循环,在每次迭代中,都希望我点击一个按钮:当我点击这个按钮时,会发生很多事情,但我不能正确地进行: -在一次尝试中,我让for循环工作,但它不会停止,在每次转弯时,它只执行第一个命令,并执行所有20个转弯而不停止 -在当前版本中,我单击按钮,什么也没有发生 -我已经研究过SOF和一系列其他网站,包括Oracle文档,但(可能也是由于我的经验水平),我找不到一个足够清晰的解释让我理解 这是我的

亲爱的朋友们:

下面是我想做的: -我想有一个简单的框架与一些按钮和一个JTextArea -我希望有一个循环,在每次迭代中,都希望我点击一个按钮:当我点击这个按钮时,会发生很多事情,但我不能正确地进行: -在一次尝试中,我让for循环工作,但它不会停止,在每次转弯时,它只执行第一个命令,并执行所有20个转弯而不停止 -在当前版本中,我单击按钮,什么也没有发生 -我已经研究过SOF和一系列其他网站,包括Oracle文档,但(可能也是由于我的经验水平),我找不到一个足够清晰的解释让我理解

这是我的密码

package game4_prova_forloop;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class GAME4_prova_forloop {

    public static void main(String[] args) {

        //create frame
        JFrame frame = new JFrame("Action Listener");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        frame.setLayout(new FlowLayout());
        frame.setVisible(true);   

        //crete text area panel, 
        JPanel pannelloTextArea = new JPanel(); 
        pannelloTextArea.setBackground(new Color(255, 204, 204));
        pannelloTextArea.setSize(400, 400);
        frame.add(pannelloTextArea); 
        GroupLayout pannelloTextAreaLayout = new GroupLayout(pannelloTextArea); 

        //create scrollPane
        JScrollPane scrollTextArea = new JScrollPane(); 

        //1) create JTextArea
        JTextArea mostraTesto = new JTextArea(20, 20); 
        mostraTesto.setLineWrap(true);  //make it wrap text 
            pannelloTextArea.add(scrollTextArea); //add it to scroll pane
            pannelloTextArea.revalidate();
                scrollTextArea.add(mostraTesto); //add the scroll pane to text area 
                scrollTextArea.setViewportView(mostraTesto); 

        //2) create buttons 
        JButton action1 = new JButton("1");
        frame.add(action1);
        JButton action2 = new JButton("2");
        frame.add(action2);
        JButton action3 = new JButton("3");
        frame.add(action3);

        //3) pass textArea in the RoundLevelAction class
        RoundLevelAction roundLevelActionObj = new RoundLevelAction(mostraTesto); //first issue: I get an error
        //4) add listener to JButtons
        action1.addActionListener(roundLevelActionObj);
        action2.addActionListener(roundLevelActionObj);
        action3.addActionListener(roundLevelActionObj);          
    }

//THIS IS WHERE I START TO HAVE PROBLEMS: WHEN I CLICK NOTHING HAPPENS, WHEN 
//I WOULD EXPECT THE FOR LOOP TO GO THROUGH ITERATIONS
    public class RoundLevelAction implements ActionListener {

        //add inside the listener the pieces of GUI that you'll use
        private JTextArea mostraTesto;
        private Object action1;
        private Object action2;
        private Object action3;
        private Object action4;
        private Object action5;
        private Object action6;

        //create class for JTextArea
        public RoundLevelAction(JTextArea mostraTesto){
            this.mostraTesto = mostraTesto; 
        }    

        //and, finally, what I really want to do: a loop that, at each turn, expects me to click on 
        //a button and does an action in response
        public void actionPerformed(ActionEvent e) {
            //now create the loop
            for (int round_counter=1; round_counter<21; round_counter++) {                                       
                if (e.getSource()==action1){                             
                    mostraTesto.append("\n description action 1 and a bunch of other stuff");
                }
                else if (e.getSource()== action2){ 
                    mostraTesto.append("\n description action 2 and a bunch of other stuff");
                } 
                else if (e.getSource()== action3){
                    mostraTesto.append("\n description action 3 and a bunch of other stuff");
                } 
            }
        }
    }

}
package game4\u prova\u forloop;
导入java.awt.Color;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.GroupLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
公共类游戏4_prova_forloop{
公共静态void main(字符串[]args){
//创建框架
JFrame=新的JFrame(“动作侦听器”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(600600);
frame.setLayout(新的FlowLayout());
frame.setVisible(true);
//克里特文字区域面板,
JPanel pannelloTextArea=新的JPanel();
pannelloTextArea.setBackground(新颜色(255204204));
pannelloTextArea.setSize(400400);
帧。添加(pannelloTextArea);
GroupLayout pannelloTextAreaLayout=新的GroupLayout(pannelloTextArea);
//创建滚动窗格
JScrollPane scrollTextArea=新建JScrollPane();
//1) 创建JTextArea
JTextArea mostraTesto=新的JTextArea(20,20);
mostraTesto.setLineWrap(true);//将其换行为文本
pannelloTextArea.add(scrollTextArea);//将其添加到滚动窗格
pannelloTextArea.revalidate();
scrollTextArea.add(mostraTesto);//将滚动窗格添加到文本区域
scrollTextArea.setViewportView(mostraTesto);
//2) 创建按钮
JButton action1=新JButton(“1”);
框架.增加(行动1);
JButton action2=新JButton(“2”);
框架.增加(行动2);
JButton action3=新JButton(“3”);
框架.增加(行动3);
//3) 在RoundLevelAction类中传递textArea
RoundLevelAction roundLevelActionObj=新的RoundLevelAction(mostraTesto);//第一个问题:我收到一个错误
//4) 将侦听器添加到JButtons
action1.addActionListener(roundLevelActionObj);
action2.addActionListener(roundLevelActionObj);
action3.addActionListener(roundLevelActionObj);
}
//这就是我开始遇到问题的地方:当我单击时,什么都没有发生,当
//我希望FOR循环经过迭代
公共类RoundLevelAction实现ActionListener{
//在侦听器中添加将要使用的GUI片段
私人区域mostraTesto;
私人物品诉讼1;
私人物品诉讼2;
私人客体诉讼3;
私人物品诉讼4;
私人物品诉讼5;
私人客体诉讼6;
//为JTextArea创建类
公共层面行动(JTextArea mostraTesto){
this.mostraTesto=mostraTesto;
}    
//最后,我真正想做的是:一个循环,在每次转弯时,都希望我点击它
//按钮并执行相应的操作
已执行的公共无效操作(操作事件e){
//现在创建循环

对于(int round_counter=1;round_counter为什么您的代码当前不工作,以及您以前的尝试可能有什么问题

action1.addActionListener(roundLevelActionObj);
action2.addActionListener(roundLevelActionObj);
action3.addActionListener(roundLevelActionObj);  
这将为每个按钮添加相同的侦听器。当您单击其中一个按钮时,将生成一个
ActionEvent
,并发送到
ActionListener

当您的
ActionListener
中有一个
for
循环时,每次单击这些按钮时,都会执行整个循环。执行的是
actionPerformed
方法中的整个代码块。这可能是您第一次尝试时发现的

您当前的尝试有
if(e.getSource()==action1)
循环中检查
。但是,该语句中的
action1
与您单击的按钮不同。此处的
action1
指的是该字段

private Object action1;
RoundLevelAction
类中。如果使用调试器,您将看到那些
If
语句的计算结果都不是
true
,这就是为什么您会觉得什么都没有发生。 实际上,会触发
for
循环,但不会输出任何内容,因为
if
语句的计算结果都不是true

如果使用调试器并放置一些断点,则可以轻松发现上述所有内容

现在来看看你问题的解决办法。我不清楚

我希望有一个循环,在每一次迭代中,它都是我所期望的 点击按钮

这个要求的问题是Swing是单线程的。这意味着所有与Swing相关的操作都应该在一个线程(E(vent)D(ispatch(T(hread))上进行,并且该线程用于处理用户输入(例如,鼠标单击)这也意味着,如果你以某种方式阻止了单个线程,你的UI就会变得不响应

因此,如果您有一个循环,您不能简单地阻止EDT并等待按钮单击。由于EDT被阻止,因此无法单击EDT

  • 要么在单独的线程上循环,然后在该线程中等待,直到用户单击按钮