不断更新GUI元素的最佳方法

时间:2009-02-11 22:14:19

标签: java multithreading user-interface performance

我有一个Java GUI,它有许多文本字段,其值从另一个类的静态变量填充。

我很想知道最好的方法是什么,这样当在另一个类中更改变量时,更新会立即反映在GUI上。

如果有人能以有效的方式提出建议,我们将非常感激。

非常感谢你提前回复

编辑:

其他详情

  • 使用Swing
  • 理想情况下,更新是实时的

4 个答案:

答案 0 :(得分:3)

在我看来,明智的选择是在Observer Pattern之后实施它。你可以找到关于这个主题的大量例子,如this

答案 1 :(得分:1)

您没有提到您正在使用的工具包以及项目的体系结构。

目前还不清楚你想要更新GUI元素的速度和频率,因为flickrers的成本可能太高,因此使用监听机制的通知成本可能会很高。

如果确定更改是相当简单的,如果我不需要实时性能而只需要向用户提供一些反馈,那么我很高兴运行后台线程,偶尔会进行检查和更新,如果必要的。

答案 2 :(得分:0)

最简单的方法是首先控制对该静态变量的所有访问。将其设为私有,并且只能通过某种方法进行修改。其次,让该方法在所有这些文本字段上调用setText(),并将它们设置为新值。

如果可以在事件调度线程之外更改该变量的值,则该方法必须使用SwingUtilities.invokeLater()来设置这些文本字段;组件只能由EDT访问。

如果每个文本字段的显示都是通过多个分散方法计算的,那么您的变量设置方法只需要调用这些方法(可能包含在invokeLater()中,如上所述)。

如果变量修改代码事先不知道哪个文本字段会受到影响,那么您需要允许控制每个文本字段的对象将自己添加到修改代码中作为侦听器。 (这是MVC设计,通常认为是好的。)然后修改代码调用其列表中的每个侦听器,并让它知道值已更改。

答案 3 :(得分:0)

Observer / Observable使用侦听器。这里有一个实例变量:

public class StaticVarClass {
    public static interface Listener {
        public void varChanged(Object oldVar, Object newVar);
    }

    private Object var;

    private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();

    public void addListener(Listener l) { listeners.add(l); }
    public void removeListener(Listener l) { listeners.remove(l); }

    protected void fireVarChanged(Object oldVar, Object newVar) {
        for (listener : listeners) listener.varChanged(oldVar, newVar);
    }

    public void setVar(Object newVar) {
        fireVarChanged(var, var = newVar);
    }

当然,您也可以使用内置的PropertyChangeListener机制。