所以,我正在制作一个 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();
}
}