JFrame(swing)使用按钮

时间:2017-09-13 14:45:49

标签: java swing jframe

我想要一个带有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();
        }

    }
}

但是在点击一个按钮后,它一直停留在那个打印件上,我甚至无法与按钮进行交互。我错过了什么或者我需要一个完全不同的结构吗?我已经检查了很多不同的程序,但是它们太复杂了我无法理解,读取并发性并没有为我清除它。

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

1 个答案:

答案 0 :(得分:1)

您的代码有很多错误

首先是错误的字符串比较(参见here)。

但是您的实际问题是:您正在睡觉事件调度程序线程(请参阅there

因此,您对事件监听器睡眠的想法只是错误的方法。你不能这样做。你必须重新思考你的方法。

这里的真正的答案是:你缺乏基本的 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组件执行某些操作 - 触发其他操作

示例:更改radiobuttons会导致触发事件。你不应该有一个循环定期检查这些按钮。相反,您可以定义用户必须遵循的明确的操作/事件流,以便触发某个操作。