gpt4 book ai didi

java - 我的 Swing GUI 没有更新。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:23 25 4
gpt4 key购买 nike

enter image description here

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

最佳答案

你仍然可以创建一个 sscce,只是不用担心 xml 数据等。简化问题,伙计。另外,不要将 java.util.Timer 与 Swing 应用程序一起使用,而应使用 javax.swing.Timer,一个 Swing 计时器。否则您将对 Swing EDT 进行 Swing 更改,这是危险的。

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

关于java - 我的 Swing GUI 没有更新。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com