从另一个类访问 Swing 组件

Posted

技术标签:

【中文标题】从另一个类访问 Swing 组件【英文标题】:Accessing Swing-Components from another class 【发布时间】:2012-09-07 16:40:18 【问题描述】:

我有一个结构如下的 Java-Swing-GUI: JFrame -- JPanel1 -----jButton1 -----jLabel1

我的目标是,当按下 jButton1 时,我想更改 jLabel1 的颜色或在其上设置一些文本,但这应该在外部类中完成(我们称之为 externalClass)。

所以在 GUI 类的构造函数中,我将自己传递给我的外部类:

public class GUIclass extends javax.swing.JFrame   
    private externalClass e;
    public GUIclass() 
        initComponents();
        e = new externalClass(GUIclass.this);

在我的外部课程中,我无法访问例如标签:

private GUIclass g;
public externalClass(GUIclass g) 
    this.g = g;
    System.out.println(g.getComponentCount());
        // --> only 1, is this the JFrame (?)
    System.out.println(g.getComponent(0).getName());
        // always "null"

谁能向我解释我如何才能访问该标签? 我也很担心为什么组件的名称总是“null”。

提前致谢!

【问题讨论】:

【参考方案1】:

您在 JPanel 中使 JLabel 的实例成为全局的,并在 JPanel 中为您的 JLabel 提供一个 getter。

您通过构造函数将 JPanel 的实例传递给您的外部类。

在您的外部类中,您使用 JPanel 实例来获取 JLabel 实例。

JLabel label = panel.getJLabel();

【讨论】:

【参考方案2】:

只有一个组件直接连接到JFrame,即JRootPane

要从ExternalClass 访问JLabel,您可以从框架的内容窗格中获取组件:

JPanel panel = (JPanel) g.getContentPane().getComponent(0);
JLabel label = (JLabel) panel.getComponent(1);

还有

g.getComponent(0).getName()

将默认返回 null,因为这是设置为 JRootPane 的名称。

更多信息请见How to Use Root Panes。

【讨论】:

以上是关于从另一个类访问 Swing 组件的主要内容,如果未能解决你的问题,请参考以下文章

访问其他类的 Swing 组件

从另一个不同的 AngularJS 组件访问表单(用于验证)

Angular 2 从另一个组件访问组件

Angular2从另一个组件访问变量

无法从另一个组件/ Angular 4中的auth.service访问错误消息

如何使用 React 和 Redux 从另一个组件访问 ref?