我对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 ();
}
}
答案 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();
}
}