在父母从其他来源重新绘制之前,不会绘制添加的组件

时间:2016-01-20 12:51:55

标签: java swing java-8

当我修改任何深度的组件树中的组件时,修改通常会立即自动显示,而不需要我为此采取任何操作。

当修改是添加新孩子时,情况并非如此 此外,如果我想使用任何适当的方法(据我理解API)强制重绘,这也没有实际效果。

只有在对现有树进行新修改 - 包括添加但仍然不可见的组件时,才会显示添加的子项。

这是一个例子,它将呈现一个带有"添加"的黑色窗口。底部的按钮。单击该按钮将不起作用。调整窗口大小或最小化将导致尽可能多的白色" XX"要显示的字符串,因为事先按下了按钮。

当然,非常希望每当按下按钮时,添加内容会立即显示

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Applikation
{
  public static void main(String[] argumente)
  {
    Box dummy     = new Box(BoxLayout.Y_AXIS);
    JFrame window = new JFrame();
    JPanel panel  = new JPanel();

    panel.setBackground(Color.black);
    window.add(dummy);
    dummy.add(panel);

    JButton button = new JButton("Add");
    button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e)
    {
      JLabel white = new JLabel("XX");
      white.setBackground(Color.white);
      white.setForeground(Color.white);
      panel.add(white);   // only visible after resizing window or switching focus to another program and back
      panel.invalidate(); // does nothing
      panel.repaint();    // does nothing
      panel.repaint(200); // does nothing
    } });

    dummy.add(button);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
  }
}

我错过了什么?

请注意,这基本上是this question的副本,但是在我的示例代码中可以看到,它的答案都不适用:它们根据经验不起作用。

0 个答案:

没有答案