我想要一个带有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编码。
您的需求似乎是: 后 该按钮被击中-和一定的时间量传递要打印在控制台上的东西。您可以这样做:
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(); }
以上:
我没有通过编译器来运行它-它的意思是“伪代码”,为您提供一些解决问题的方法。
但是,对此进行进一步考虑-我认为这是朝 错误的 方向进行的。你不希望 任何事情 是 等待 ,当你制定合理的UI应用程序。
换句话说:您想到了:
错误的方法。而是按照以下方式工作:
示例:更改单选按钮会触发事件。您不应有定期检查这些按钮的循环。取而代之的是,您定义了用户必须遵循的明确的操作/事件流,才能触发特定操作。