JAVA摆动更新组件';独立处理内容

JAVA摆动更新组件';独立处理内容,java,swing,Java,Swing,如何分别(独立)更新多个可见(一次)组件的内容? 例如,我想显示某种带有连接信息的进度指示器,它应该只更新/绘制,而不在表单上绘制所有其他组件? 或者,如果我有多个正在进行的组件,并且必须只更新它们的内容。每当您调用repait函数(或setText等方法之一为您调用该函数)时,该组件将重新绘制自身以及内部的所有其他组件。为了重新绘制一件事情,只需调用该特定组件的repaint()方法。这将节省内存,并且更加可预测 在一个使用JProgressBar的示例中 JFrame frame = new

如何分别(独立)更新多个可见(一次)组件的内容? 例如,我想显示某种带有连接信息的进度指示器,它应该只更新/绘制,而不在表单上绘制所有其他组件?
或者,如果我有多个正在进行的组件,并且必须只更新它们的内容。

每当您调用repait函数(或setText等方法之一为您调用该函数)时,该组件将重新绘制自身以及内部的所有其他组件。为了重新绘制一件事情,只需调用该特定组件的repaint()方法。这将节省内存,并且更加可预测

在一个使用JProgressBar的示例中

JFrame frame = new JFrame("Title");
JPanel panel = new JPanel();
JProgressBar pBar = new JProgressBar(SwingConstants.HORIZONTAL, 0, 100);
panel.add(pBar);

frame.add(panel);

pBar.repaint();    // Will only repaint the progress bar
您还可以仅重新绘制程序的特定部分。因此,假设进度条位于(100100),宽100,高20:

frame.repaint(new Rectangle(100, 100, 100, 20));
你可以(也必须在这里)安排你的更新。不应在GUI线程中运行长时间运行的计算(如果有进度条,这似乎不太可能)。但是您仍然需要让GUI知道它需要更新。。。大概是这样的:

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

// I didn't seem to see anything like this with a quick look-through.
// anybody else know differently?
public class ComponentUpdater implements ActionListener {

    private static List<Component> componenets = new ArrayList<Component>();

    public void addComponent(Component component) {
        componenets.add(component);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        for(Component component : componenets) {
            component.repaint();
        }
    }
}
这将导致添加到更新程序中的每个组件都有
repaint()
调用者,每次500毫秒,永远


当然,有很多更优雅的方法可以做到这一点(比如能够指定更新位置),但这是一个简单的方法,可以让您开始使用。

看看前面的方法是否有用。您不应该调用
repaint()让进度条在模型更改时自动更新。因此,如上所述,在
组件
上调用
重新绘制
将导致仅更新此确切的
组件
?即使这个组件被画在另一个组件的下方?例如,在某个层下方或
玻璃窗格
内容下方?该组件(仅包括子组件)将被更新。例如,如果您有一个带有两个
JPanel
s的
JFrame
:将
JFrame
放入将导致所有内容更新。只放入一个
JPanel
s将导致更新该面板,而不会更新另一个。请注意,
repaint()
仍可能以“随机”间隔调用(只要GUI线程愿意)。
UpdatingComponent componentToUpdate = new UpdatingComponent(dataSourceToExamine);
panel.add(componentToUpdate);

ComponentUpdater updater = new ComponentUpdater();
updater.addComponent(componentToUpdate);

Timer schedule = new Timer(500, updater);
timer.setRepeats(true);
timer.start();