比Box更有效的布局

我有一些非常古老的代码,它使用Box列出一些信息。 我这样创建它:

 Box patterns = Box.createVerticalBox(); 

非常(非常)经常添加新项目并删除旧项目,例如:

 label = new JLabel("xyz"); patterns.add(label); 

然后

 patterns.remove(label); 

每当添加一些东西时,我必须重新涂抹,所以我打电话给:

 patterns.revalidate(); patterns.repaint(); 

问题是,因为这种情况经常发生,所以它会占用UI。 我认为我需要一个更好的实现,以使其更有效。

我知道我可以在后台维护一个活动项目列表,然后间歇性地更新实际UI(批量更新)但是…

有人可以提出更有效的替代方法吗?

为什么不使用JList并实现单元格渲染器 ?

或者使用JTable更灵活并实现表格单元格渲染器 (而不是返回Component )?

基于此示例 ,以下代码以10 Hz的频率执行16个标签。

 import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.imageio.ImageIO; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.Timer; /** @see https://stackoverflow.com/questions/6605554 */ public class ImageLabelPanel extends Box implements ActionListener { private static final int N = 16; private final List list = new ArrayList(); private final Timer timer = new Timer(100, this); ImageLabelPanel() { super(BoxLayout.Y_AXIS); BufferedImage bi = null; try { bi = ImageIO.read(new File("image.jpg")); } catch (IOException e) { e.printStackTrace(System.err); } for (int r = 0; r < N; r++) { int w = bi.getWidth(); int h = bi.getHeight() / N; BufferedImage b = bi.getSubimage(0, r * h, w, h); list.add(new JLabel(new ImageIcon(b))); } createPane(); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setVisible(true); timer.start(); } private void createPane() { this.removeAll(); for (JLabel label : list) { add(label); } this.revalidate(); } @Override public void actionPerformed(ActionEvent e) { Collections.shuffle(list); createPane(); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new ImageLabelPanel(); } }); } }