【问题标题】:Java - Accessing JLabel inside JPanelJava - 在 JPanel 中访问 JLabel
【发布时间】:2023-04-02 10:52:01
【问题描述】:

我有一个 GUI,其中包含一个面板,其中包含一个组件和一个与该组件相关的标签。标签被创建并且从未改变,所以目前,我只是在JPanel.add() 方法中拥有它们的构造函数。

    //add label
    toServerPanel.add(new JLabel("Your Message"), BorderLayout.NORTH);
    //add component
    toServerPanel.add(toServer, BorderLayout.SOUTH);

这很好用,它们作为匿名对象也很好,但我现在想更改应用程序中部分或全部标签的文本颜色。由于它们是匿名对象,因此无法通过变量名访问它们,但同时我不想创建无休止的 JLabel 变量。

在当前情况下,是通过检查JPanel 中的对象来访问JLabel 对象的方法或函数吗? 或者,是否有某种循环会影响 GUI 上的所有 JLabel 对象?

谢谢, 标记

【问题讨论】:

  • “标签被创建并且从未改变” - 所以这可能看起来像一个愚蠢的声明,那么你为什么不在toServerPanel 中提供一个getter来检索他们?如果您想通过某个标识符查找它们,您可以在 List 或事件 Map 中维护它们?

标签: java swing jpanel jlabel


【解决方案1】:

您可以循环访问面板的所有组件:

for (Component jc : toServerPanel.getComponents()) {
    if ( jc instanceof JLabel ) {
        // do something
    }
}

编辑
这是我创建和测试的最小工作示例。两个 JLabel 的颜色是在点击按钮时随机分配的:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class ComponentTest extends JFrame implements ActionListener {

    private JPanel mainPanel;
    private Random r;

    public ComponentTest() {
        super("TestFrame");

        r = new Random();
        mainPanel = new JPanel(new BorderLayout());
        mainPanel.add(new JLabel("I'm a Label!"), BorderLayout.NORTH);
        mainPanel.add(new JLabel("I'm a label, too!"), BorderLayout.CENTER);

        JButton triggerButton = new JButton("Click me!");
        triggerButton.addActionListener(this);
        mainPanel.add(triggerButton, BorderLayout.SOUTH);

        setContentPane(mainPanel);

        this.pack();
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
        for (Component jc : mainPanel.getComponents()) {
            if (jc instanceof JLabel) {
                JLabel label = (JLabel) jc;
                label.setForeground(c);
            }
        }
    }

    public static void main(String[] args) {
        new ComponentTest();
    }
}

【讨论】:

  • 您好,试过了,标签似乎不受影响。知道为什么会这样吗?
  • @marcuthh 我添加了一个工作示例。如果标签不受影响,标签是否可能不是直接子级 - 例如包裹在另一个面板中?
【解决方案2】:

如果您的JLabel 是面板中唯一的一个组件,您可以执行以下操作:

JLabel lbl = (JLabel)toServerPanel.getComponent(0);

还有句柄lbl

【讨论】:

  • 谢谢你,这种解决方案可以放入一个循环中,对所有面板都执行相同的操作吗?
  • 当然,您也可以使用方法 getComponents() 来迭代所有组件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多