等待不允许JFrame更新

时间:2017-04-25 22:55:32

标签: java swing jframe wait notify

在我的程序中,我需要等待用户从JFrame输入。当用户完成第一个输入时,他们按下JButton。这将调用我制作的Class I的构造函数:HumanTrainer。在构造函数中,我需要用户有更多的输入。我做了两个等待和通知的功能。但是当代码等待时,所有内容都会冻结,并且JFrame不会更新为应该的内容。

这是第一个按钮预先形成的动作

startingButton.addActionListener((e)->{
        Trainer[]t=new Trainer[2];//HumanTrainer extends Trainer
        String[]names=new String[2];
        for(int a=0;a<2;a++)
            names[a]=((JTextField)(startingInputs[2][1+a])).getText();
        grid.removeAll();//The JPanel that the Frame has
        Frame.repaint();//The JFrame
        Frame.validate();
        if(isHuman[0])
            t[0]=new HumanTrainer(names[0],grid,Frame);//The constructor
        if(isHuman[1])
            t[1]=new HumanTrainer(names[1],grid,Frame);

    });

HumanTrainer的构造函数

HumanTrainer(String name,JPanel grid,JFrame Frame){
    super(name);

    GridBagConstraints manager=new GridBagConstraints();
    manager.gridx=0;
    manager.gridy=0;
    manager.gridheight=1;
    manager.gridwidth=1;
    manager.fill=GridBagConstraints.HORIZONTAL;
    Font Format=new Font("Courier New",Font.PLAIN,14);

    JButton cont=new JButton("Continue");//This is the button that when clicked should run the function that notifies

    grid.add(cont,manager);

    grid.repaint();//One of these four things SHOULD change the view of the frame
    grid.validate();
    Frame.repaint();
    Frame.validate();

    System.out.print("TEST");//This prints
    cont.addActionListener((e)->{
        made();//This is a function contained in HumanTrainer that only calls notify();
    });
    make();//This is a function contained in HumanTrainer that only calls wait(); With the proper try and catch
}

但是当按下starterButton时,屏幕会冻结并且不会更新,因此可以按下cont。

2 个答案:

答案 0 :(得分:1)

首先看一下Concurrency in Swing。如果你在EDT中执行任何长时间运行或阻塞操作(如调用wait),Swing使用单个线程来调度它的事件,然后它冻结你的程序,用户将不得不终止它。

您有两个基本选择。您可以使用模态对话框从用户收集信息,请参阅How to Make Dialogs,这将阻止代码在显示时执行,而不会阻止整个EDT或使用可生成的观察者模式用户已提供您期望的任何信息的通知。

老实说,模态对话框通常更容易,有助于防止意外的副作用

此...

make();//This is a function contained in HumanTrainer that only calls wait(); With the proper try and catch

似乎是您问题的核心,但如果没有更多信息和您想要做的事情的背景,那么我们无法真正建议您应该做什么,但我建议您查看{{3}并将您的代码分成更合适的图层

答案 1 :(得分:0)

首先,您可能希望使用{}关闭for循环,以便它不会将整个代码循环两次。此外,您应该在没有java awt的情况下单独测试wait()notify()是否正常工作。