Container.getComponents()是否返回对原始组件的引用?

时间:2011-03-20 20:38:37

标签: java user-interface swing

我正在使用Container.getComponents()来获取存储在Container中的Components数组。我正在修改其中一个组件(恰好是JLabel),但是这些更改没有显示在GUI上。

所以我想也许这个方法会创建每个Component的新实例,阻止我对原始组件进行更改?

这是我的代码:

Component[] components = source.getComponents();
if(components.length >= 2) {
    if(components[1] instanceof JLabel) {
        JLabel htmlArea = (JLabel) components[1];
        htmlArea.setText("<html>new changes here</html>");
        htmlArea.revalidate();
    }
}

2 个答案:

答案 0 :(得分:1)

这是代码之外的另一个问题,或者你是从错误的线程执行此操作。

Swing组件的任何更改都应该在事件派发线程中完成。通常情况下,使用EventQueue.invokeLater(...)(或SwingUtilities.invokeLater围绕不断变化的代码最容易,这是相同的。)

确保您的组件在屏幕上实际可见。

答案 1 :(得分:0)

没有必要重新验证()或重绘()任何东西(除非你做的事情真的很奇怪)!

你的SSCCE在哪里证明你的问题???

它适用于我:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TabbedPaneLabel extends JFrame
{
    JTabbedPane tabbedPane;

    public TabbedPaneLabel()
    {
        tabbedPane = new JTabbedPane();
        add(tabbedPane);

        tabbedPane.addTab("First", createPanel("<html>label with text</html>"));
        tabbedPane.addTab("Second", createPanel("another label"));

        JButton remove = new JButton("Change Label on first tab");
        add(remove, BorderLayout.SOUTH);
        remove.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                Component[] components = tabbedPane.getComponents();
                JPanel panel = (JPanel)components[0];
                JLabel label = (JLabel)panel.getComponent(0);
                String date = new Date().toString();
                label.setText("<html>" + date + "</html>");
            }
        });
    }

    private JPanel createPanel(String text)
    {
        JPanel panel = new JPanel();
        panel.add( new JLabel(text) );
        return panel;
    }

    public static void main(String args[])
    {
        TabbedPaneLabel frame = new TabbedPaneLabel();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.setSize(300, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}