小编典典

JFrame(摆动)通过按钮切换重复动作

java

我想要一个带有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的并发性也并没有为我解决。

编辑:还没有“停止”命令,因为我现在不需要它。


阅读 214

收藏
2020-11-26

共1个答案

小编典典

您的代码有很多 错误

它以 错误 的字符串比较开始(请参阅此处)。

但是您的实际问题是:您正在使事件调度程序线程处于 休眠状态
(请参阅此处

因此,您与事件监听器一起 睡觉 的想法是错误的方法。你不能这样子。您必须重新考虑在那里的方法。

真正 在这里的答案是:你缺乏 基本的 Java知识。考虑学习这些基本的东西 第一 前进一步的负担过重,如果自己的Swing UI编码。

您的需求似乎是: 该按钮被击中-和一定的时间量传递要打印在控制台上的东西。您可以这样做:

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组件执行某些操作-触发 其他 操作

示例:更改单选按钮会触发事件。您不应有定期检查这些按钮的循环。取而代之的是,您定义了用户必须遵循的明确的操作/事件流,才能触发特定操作。

2020-11-26