Java的。摇摆。独立更新组件的内容

时间:2011-12-05 16:38:27

标签: java swing

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

2 个答案:

答案 0 :(得分:2)

您可以(并且必须在此处)安排您的更新。你不应该在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();
        }
    }
}

要使用它,你需要一个计时器:

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();

这将导致添加到更新程序的每个组件永远有repaint()来电者500毫秒。

当然有更多优雅的方法(比如能够指定更新位置),但这是一个简单的方法,可以帮助您入门。

答案 1 :(得分:0)

每当您调用repaint函数(或者您的某个方法,例如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

您也可以只重新绘制程序的特定部分。假设进度条位于(100,100)并且宽100和高20:

frame.repaint(new Rectangle(100, 100, 100, 20));