在我的程序中,我需要等待用户从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。
答案 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()
是否正常工作。