2011-07-07 43 views
3

我有一些非常老的代碼,它使用Box來列出一些信息。我創建它像這樣:佈局比Box更有效

Box patterns = Box.createVerticalBox(); 

很(非常)通常,新的項目加入,老項目被刪除例如:

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

後來

patterns.remove(label); 

每當補上一去除礦石我必須重漆,所以我打電話:

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

問題是,因爲這經常發生,所以它扼殺了用戶界面。我想我需要更好的實施,以使其更有效率。

我知道我可以保持在後臺活動項目的列表,然後間歇性地更新實際UI(批量更新),但...

有人能提出一個更有效的替代方法?

+0

從分析的任何指導? – trashgod

回答

6

爲什麼不只是使用JList並實施cell renderer

或者更靈活一個JTable並執行table cell renderer(返回Component代替)?

+1

輕量級+1。 – trashgod

+0

我已經更改爲使用'JList' +'DefaultListModel'和擴展'DefaultListCellRenderer',標記它生成的JLabel。大約1000 *效率。謝謝。 – pstanton

+1

@pstanton JList和JTable默認返回JLabel @Yanick Rochon +1 – mKorbel

3

基於這個example,下面的代碼在10Hz下做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<JLabel> list = new ArrayList<JLabel>(); 
    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(); 
      } 
     }); 
    } 
} 
+1

我不認爲這是佈局。 – trashgod