Содержит ли Container.getComponents () ссылки на исходные компоненты? - PullRequest
2 голосов
/ 20 марта 2011

Я использую Container.getComponents (), чтобы получить массив компонентов, хранящихся внутри контейнера.Затем я изменяю один из этих компонентов (который является JLabel), но изменения не отображаются в графическом интерфейсе.

Так что я думаю, что, возможно, метод создает новые экземпляры каждого компонента, который предотвращаетмне внести изменения в исходный компонент?

Вот мой код:

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 ]

1 голос
/ 21 марта 2011

Это либо другая проблема вне кода, либо вы делаете это из неправильного потока.

Любые изменения в компонентах Swing должны быть сделаны в потоке диспетчеризации событий.Часто легче всего окружить изменяющийся код EventQueue.invokeLater(...) (или SwingUtilities.invokeLater, это то же самое).

И убедитесь, что ваш компонент действительно виден на экране.

0 голосов
/ 21 марта 2011

Нет необходимости что-либо повторно проверять () или перерисовывать () (если вы не делаете что-то действительно странное)!

Где находится ваш 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...