Java JFrame(swing)使用按钮切换重复动作
我想要一个带有2个按钮(最终更多)的JFrame应用程序,我可以使用它在多个重复动作之间切换,为了简单起见,我现在只使用一个控制台打印,尽管稍后它可能会调用一个方法。以下是JFrame的框架:Java JFrame(swing)使用按钮切换重复动作,java,swing,jframe,Java,Swing,Jframe,我想要一个带有2个按钮(最终更多)的JFrame应用程序,我可以使用它在多个重复动作之间切换,为了简单起见,我现在只使用一个控制台打印,尽管稍后它可能会调用一个方法。以下是JFrame的框架: public class DayNight extends JFrame implements ActionListener{ //JFrame entities private JPanel animationPanel; private JButton button;
public class DayNight extends JFrame implements ActionListener{
//JFrame entities
private JPanel animationPanel;
private JButton button;
private JButton button2;
public static void main(String[] args) {
DayNight frame = new DayNight();
frame.setSize(2000, 1300);
frame.setLocation(1000,350);
frame.createGUI();
frame.setVisible(true);
frame.setTitle("Day/Night Cycle, Rogier");
}
private void createGUI() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = getContentPane();
window.setLayout(new FlowLayout() );
animationPanel = new JPanel();
animationPanel.setPreferredSize(new Dimension(2000, 900));
animationPanel.setBackground(Color.black);
window.add(animationPanel);
button = new JButton("choice1");
button.setFont(new Font("Arial", Font.PLAIN, 50));
window.add(button);
button.setActionCommand("choice1");
button.addActionListener(this);
button2 = new JButton("choice2");
button2.setFont(new Font("Arial", Font.PLAIN, 50));
window.add(button2);
button2.setActionCommand("choice2");
button2.addActionListener(this);
}
}
我尝试了以下方法:
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
while ("Stop"!=(command)){
command = event.getActionCommand();
try{
Thread.sleep(500);
if ("choice1".equals(command)){
System.out.println("choice1");
}
else if("choice2".equals(command)){
System.out.println("choice2");
}
else{
System.out.println("no choice");
}
}
catch(InterruptedException ex){
Thread.currentThread().interrupt();
}
}
}
但当我点击一个按钮后,它会一直停留在打印上,我甚至不能再和按钮互动了。我是否遗漏了什么,或者我需要一个完全不同的结构?我已经研究了很多不同的程序,但它们太复杂了,我无法理解,阅读swing中的并发性也没有让我清楚
编辑:还没有“停止”命令,因为我现在不需要它。您的代码有很多错误 它以字符串的错误比较开始(请参阅) 但是您的实际问题是:您正在休眠事件调度程序线程(请参阅) 因此,你认为与事件监听器一起睡觉是错误的做法。你不能这样做。你必须重新考虑你的方法 这里真正的答案是:您缺乏Java的基本知识。在学习Swing UI编码之前,先考虑学习这些基本的东西<强>第一/强>。p>
您的要求似乎是:在按下该按钮之后,经过一定的时间,您希望在控制台上打印一些内容。你可以这样做:
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
command = event.getActionCommand();
Runnable printChoice = new Runnable() {
@Override
public void run() {
try{
Thread.sleep(500);
if ("choice1".equals(command)){
System.out.println("choice1");
}
else if("choice2".equals(command)){
System.out.println("choice2");
}
else{
System.out.println("no choice");
}
}
catch(InterruptedException ex){
Thread.currentThread().interrupt();
}
});
new Thread(printChoice).start();
}
上述:
- 创建一个Runnable,它只需等待然后打印某些内容
- 使用一个新线程(不是事件调度程序线程)来执行此操作
- 单击按钮A-某些代码开始“循环”
- 当用户做出另一个选择时,“循环”代码会注意到这一点并执行某些操作
- 用户单击一个按钮,可能会启用其他UI组件
- 用户对这些其他UI组件执行某些操作—触发其他操作
示例:更改单选按钮会触发事件。您不应该有一个定期检查这些按钮的循环。相反,您可以定义一个清晰的操作/事件流,用户必须遵循这些操作/事件才能触发特定的操作。阅读Swing教程中的部分,了解为什么不希望从侦听器中调用的代码中调用Thread.sleep()。本教程包含了所有Swing基础知识。我将继续学习我的基本Java,但我也必须在作业截止日期前完成。你有适合我的目标的程序示例或方法名称吗,我可以用它检查和重写我的程序?从@camickr在评论中给出的链接开始——分别阅读我给你的链接。我阅读了swing中的所有链接和并发性,我更了解EDT和etc的工作原理,我只是不知道如何开始。“你的要求似乎是:在按下那个按钮之后——经过一定的时间,你想在控制台上打印一些东西。”我想一直打印匹配的单词,直到我按下另一个按钮,这时它会重复打印另一个单词。这就是你用伪文本写的意思,还是只打印一次?(在我误解地重新编写代码之前)简言之:它是在单击按钮后运行一次,还是反复检查当前命令?