3

在此处输入图像描述

所以,我正在制作一个 GUI,用户可以在其中添加或删除面板。为了模拟这一点,我制作了一个带有TimerTask目标名称JPanel和包含JPanel.
它倒计时到 0,然后JPanel从父级中删除并调用repaint()父级和祖父级。

尽管旧面板被移除,但父面板中包含的其他组件并没有出现来取代它。从图中可以看出,滚动条仍然指示2个组件。

我必须手动向下拖动滚动条才能看到它的变化,这就是当下面的组件出现时取代它的位置。

为什么会这样?

以下是组件的嵌套方式:

JScrollPane (grandparent)
|
|-> JPanel (parent)
    |
    |-> JPanel (target)  

SSCCE 是不可能的,因为它JPanels填充了来自 XML 文件的数据并使用 JAXB,所以 .. 这是不可能的 :( 但这是来自TimerTask

import java.util.TimerTask;
import javax.swing.*;

public class RemoverTask extends TimerTask{
    StudentPanel s;
    JPanel h;
    JScrollPane p;
    public RemoverTask(StudentPanel s,JPanel holder,JScrollPane pane){
        this.s = s;
        h = holder;
        p = pane;
    }

    @Override
    public void run(){
        long x = Integer.MAX_VALUE/2;
        JFrame frame = new JFrame("Counter");
        JTextArea area = new JTextArea();
        JScrollPane pane = new JScrollPane(area);
        pane.setPreferredSize(new java.awt.Dimension(350, 350));
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        while(x > 100){
            x =  x - 1500;
            area.append("Value of X: " + x + "\n");
        }
        if(!frame.isVisible()){
            frame.dispose();
        }
        h.remove(s);
        h.repaint();
        pane.repaint();
    }
}
4

1 回答 1

3

您仍然可以制作 sscce,只是不要担心 xml 数据等。简化问题,伙计。此外,不要将 java.util.Timer 与 Swing 应用程序一起使用,而应使用 javax.swing.Timer,即 Swing 计时器。否则,您将在 Swing EDT 上进行 Swing 更改,这很危险。

一个问题:你永远不会调用revalidate()容器。在对容器进行更改时,您通常会在调用容器revalidate()之前调用它。repaint()重新验证告诉布局管理器布局他们的组件,这是更改 GUI 所必需的。

于 2013-05-18T18:36:08.483 回答