【问题标题】:set gui contents from another class [duplicate]从另一个类设置gui内容[重复]
【发布时间】:2020-05-29 07:52:54
【问题描述】:

我希望能够从另一个类更改一些 JLabel 对象的内容。我有一个包含所有 GUI 对象(JFrameJPanel 等)的 GUI 类。假设我只有一个JLabel

public class GUI {
    private JLabel label;

    public GUI() {
        initialize();//initializes all objects
    }

    public void update(String s) {
        this.label.setText(s);
    }
}

GUI 有一个公共函数update(String),我希望从另一个类调用它。

我的主班叫App

public class App {
    private static GUI window;

    public static void main( String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    window = new GUI();
                    App.updateTxt("some string");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
         });
    }

    public  static void updateTxt(String s) {
        window.update(s);
    }
}

此解决方案不起作用,但是,GUI.update(String)GUI 类中调用时可以正常工作。 我检查了保罗提出的解决方案: Access GUI components from another class 但我不明白。 那么如何从另一个类调用 GUI 上的方法来更改 UI?

【问题讨论】:

  • 请提供minimal reproducible example,以便我们更容易理解您的问题。此处发布的代码既没有提供有关如何构建 GUI 的信息,也没有提供有关如何调用方法 updateTxt 的信息。
  • 感谢您的回复 Janus,我们的想法是从任何类调用 App.updateTxt(),因为 App 是保存窗口(GUI 的实例)的位置。假设我们在 GUI 实例化之后调用 App.updateTxt("some string") => 结果:不幸的是,窗口中没有任何变化
  • Swing 组件有 repaint()、revalidate() 和 doLayout() 方法。其中一个应该能够重新绘制你想要的任何部分。但是,doLayout 不是您应该负责的,这是布局引擎的责任。

标签: java swing


【解决方案1】:

从发布的代码来看,GUI.update(String) 永远不会被调用,因为它是从 App.updateText(String) 内部调用的,您永远不会将其作为App.main(String[]) 的一部分调用。

尝试对App进行以下更改:

public class App {
    private static GUI window;

    public static void main( String[] args) throws InterruptedException {
        window = new GUI();
        Thread.sleep(1000); // Pause for 1 second.       
        updateText("Hello, world!"); // Update the label with new text.
    }

    public  static void updateTxt(String s) {
        window.update(s);
    }
}

【讨论】:

  • 感谢 Janus,我试过了,不幸的是窗口上仍然没有任何变化。事实上,GUI.update()确实被调用并执行了,只是GUI上的变化并没有显示出来。
【解决方案2】:

您应该注意线程,请参阅:Concurrency in Swing

也就是说,试试这样的:

public void update(final String s) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            this.label.setText(s);
        }
    });
}

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2011-03-12
    • 2014-05-21
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多