我正在使用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();
}
}
答案 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);
}
}