Java JFrame(swing)使用按钮切换重复动作

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;

我想要一个带有2个按钮(最终更多)的JFrame应用程序,我可以使用它在多个重复动作之间切换,为了简单起见,我现在只使用一个控制台打印,尽管稍后它可能会调用一个方法。以下是JFrame的框架:

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,它只需等待然后打印某些内容
  • 使用一个新线程(不是事件调度程序线程)来执行此操作
我并没有在编译器中运行它——它是作为“伪代码”来给您一些解决问题的方法

但进一步思考一下——我认为这是朝着错误的方向发展的。当您开发一个合理的UI应用程序时,您不希望有任何东西等待

换句话说:你想到:

  • 单击按钮A-某些代码开始“循环”
  • 当用户做出另一个选择时,“循环”代码会注意到这一点并执行某些操作
错误的方法。取而代之的是按照以下思路工作:

  • 用户单击一个按钮,可能会启用其他UI组件
  • 用户对这些其他UI组件执行某些操作—触发其他操作

示例:更改单选按钮会触发事件。您不应该有一个定期检查这些按钮的循环。相反,您可以定义一个清晰的操作/事件流,用户必须遵循这些操作/事件才能触发特定的操作。

阅读Swing教程中的部分,了解为什么不希望从侦听器中调用的代码中调用Thread.sleep()。本教程包含了所有Swing基础知识。我将继续学习我的基本Java,但我也必须在作业截止日期前完成。你有适合我的目标的程序示例或方法名称吗,我可以用它检查和重写我的程序?从@camickr在评论中给出的链接开始——分别阅读我给你的链接。我阅读了swing中的所有链接和并发性,我更了解EDT和etc的工作原理,我只是不知道如何开始。“你的要求似乎是:在按下那个按钮之后——经过一定的时间,你想在控制台上打印一些东西。”我想一直打印匹配的单词,直到我按下另一个按钮,这时它会重复打印另一个单词。这就是你用伪文本写的意思,还是只打印一次?(在我误解地重新编写代码之前)简言之:它是在单击按钮后运行一次,还是反复检查当前命令?