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