用GUI标记问题

时间:2014-07-28 16:41:25

标签: java swing user-interface swingworker

我对Java很新,我正在尝试创建一个GUI。这是我的GUI.java文件中的代码。它包含一个按钮和一个标签。当我点击按钮时,标签应该显示" loading ..."并在名为Main的{​​{1}}类(Main.java)中输入静态void方法并执行操作。搜索者完成后,标签变为searcher

问题:当我按下按钮时,标签完全没有变化。似乎""setText中的actionListener都不起作用。然而,其他"东西"我希望它在searcher()里面做得还可以。我没有看到任何错误。

注意:如果我尝试从主电话呼叫searcher(),它可以正常工作。

GUI.java:

searcher()

Main.java:

 public class GUI extends JFrame implements ActionListener{

    public JButton button = new JButton("Refresh!");
    public JLabel label = new JLabel("");

    public GUI(){
        Container pane = getContentPane();
        button.addActionListener(this); 
        button.setActionCommand("refresh");
        pane.add(button);
        pane.add(label);
    }
}
public void actionPerformed(ActionEvent e) {
    if ("refresh".equals(e.getActionCommand())) {
                label.setText("Loading...");
                Main.searcher(this, "", "");
                label.setText("");
            }
}
编辑:我已按照建议更改为使用SwingWorker和propertylistener的代码,但我现在遇到了麻烦。首先,'这个'不再引用GUI ..我应该在searcher方法中传递什么来传递类GUI的当前实例?

我也遇到了这个错误,而且我不确定如何修复它:

。\ GUI.java:77:错误:不是抽象的,并且不会覆盖PropertyChangeListener中的抽象方法propertyChange(PropertyChangeEvent)                                         PropertyChangeListener propChangeListn = new PropertyChangeListener(){^

public class Main{ 
public static void searcher(GUI gu, String popup, String url) {
    gu.label.setText("Loading...");
    //do stuff
    gu.label.setText("");
}
public static void main(String[] args) {
    GUI gu = new GUI ();
}
}

1 个答案:

答案 0 :(得分:3)

你的是一个经典的Swing线程问题,你将Swing事件线程与一个长时间运行的进程捆绑在一起,阻止这个线程更新GUI的图形或者与用户交互。解决方案与以往一样 - 使用后台线程进行长时间运行的处理。如果您使用SwingWorker,您甚至可以向其添加PropertyChangeListener,然后在工作人员完成其任务时收到通知,允许您使用此信息更新GUI。

Google Concurrency in Swing并点击第一次点击了解详情。

如,

public void actionPerformed(ActionEvent e) {
    if ("refresh".equals(e.getActionCommand())) {
        label.setText("Loading...");

        // create a SwingWorker object
        final SwingWorker<Void, Void> worker = new Swingworker<Void, Void>() {

            // long running code would go in doInBackground
            public Void doInBackground() throws Exception {
                Main.searcher(...);
                return null;
            }
        }

        // add a listener to worker to be notified when it is done
        worker.addPropertyChangeListener(PropertyChangeListener listener) {
            public void propertyChanged(PropertyChangeEvent pcEvt) {

                // if the worker is done...
                if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
                    label.setText("");

                    // you will probably want to call get() on your worker here
                    // and catch any exceptions that may have occurred.
                }
            }
        }

        // it may seem counter-intuitive, but you need to start the worker with 
        // execute() *after* setting all the above code up.
        worker.execute();
    }
}