java程序变得反应迟钝

时间:2015-03-11 21:09:10

标签: java swing

在我的语音识别项目中,有两个程序,一个用于逻辑(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的关闭按钮也不起作用。我该怎么做才能使其响应,以及如何阻止它?

1 个答案:

答案 0 :(得分:2)

您有一个经典的Swing线程问题,并且您的解决方案与所有其他解决方案相同:使用SwingWorker或其他后台线程来执行长时间运行的代码,以便在Swing事件线程中不调用它。有关我的代码示例,请查看此search result。有关教程,请查看Concurrency in Swing。但最重要的是,如果您使用SwingWorker,则必须从其doInBackground()方法调用长时间运行的代码。除了repaint()之外,不应该从该方法中调用任何Swing调用。如果在查看教程和链接之后仍然遇到麻烦,那么考虑创建并在编辑问题时发布一个最小的示例程序mcve,一个编译,运行并显示问题的小程序我们这不需要外部图书馆。如果你这样做,那么我可以向你展示特定于你的问题的代码。

您与btnNewButton.setBounds(10, 11, 156, 49);也存在无关的问题。您几乎从不想使用null布局和setBounds,因为它会导致严格的GUI在一个平台上看起来很好但在所有其他平台上看起来很糟糕,而且这是一个试图调试,增强或修改的女巫。相反,您将需要了解并使用布局管理器。