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