在我的语音识别项目中,有两个程序,一个用于逻辑(full program),另一个用于GUI(full program)。
在GUI程序中,我添加了这些行以使用:
JButton btnNewButton = new JButton("Start Recognizing");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
state.setText("Listening");
System.out.println("Started Listening");
state.setBackground(new Color(51, 204, 0));
// Object to use from another program
HelloWorld obj = new HelloWorld();
obj.main(args);
}
});
btnNewButton.setBounds(10, 11, 156, 49);
frame.getContentPane().add(btnNewButton);
JButton btnNewButton_1 = new JButton("Stop Recognizing");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
state.setText("Not listening");
state.setBackground(new Color(204, 0, 51));
System.out.println("Stopped Listening");
// Stop the obj.main method.
}
});
现在,当我运行程序时,它会显示GUI。但是当我点击开始按钮时,它会变得没有反应并继续听取语音。即使GUI的关闭按钮也不起作用。我该怎么做才能使其响应,以及如何阻止它?
答案 0 :(得分:2)
您有一个经典的Swing线程问题,并且您的解决方案与所有其他解决方案相同:使用SwingWorker或其他后台线程来执行长时间运行的代码,以便在Swing事件线程中不调用它。有关我的代码示例,请查看此search result。有关教程,请查看Concurrency in Swing。但最重要的是,如果您使用SwingWorker,则必须从其doInBackground()
方法调用长时间运行的代码。除了repaint()
之外,不应该从该方法中调用任何Swing调用。如果在查看教程和链接之后仍然遇到麻烦,那么考虑创建并在编辑问题时发布一个最小的示例程序mcve,一个编译,运行并显示问题的小程序我们这不需要外部图书馆。如果你这样做,那么我可以向你展示特定于你的问题的代码。
您与btnNewButton.setBounds(10, 11, 156, 49);
也存在无关的问题。您几乎从不想使用null
布局和setBounds,因为它会导致严格的GUI在一个平台上看起来很好但在所有其他平台上看起来很糟糕,而且这是一个试图调试,增强或修改的女巫。相反,您将需要了解并使用布局管理器。