java-我的Swing GUI不更新.为什么?
作者:互联网
因此,我正在制作一个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();
}
}
解决方法:
您仍然可以创建一个scsc,只是不必担心xml数据等.简化问题,伙计.另外,请勿将Java.util.Timer与Swing应用程序一起使用,而应将javax.swing.Timer与Swing计时器一起使用.否则,您将根据Swing EDT进行Swing更改,这很危险.
问题:您永远不会在容器上调用revalidate().在对容器进行更改时,通常在容器上调用repaint()之前先调用revalidate().重新验证告诉布局管理器布局其组件,这是更改GUI所必需的.
标签:repaint,swing,jpanel,jscrollpane,java 来源: https://codeday.me/bug/20191123/2066423.html