2011-07-07 3 views
3

일부 정보를 나열하기 위해 Box을 사용하는 매우 오래된 코드가 있습니다. 그래서처럼 만들 :상자보다 효율적인 레이아웃

Box patterns = Box.createVerticalBox(); 

아주 (매우) 자주, 새로운 항목이 추가되고 오래된 항목은 예를 제거 :

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

이후

patterns.remove(label); 

뭔가가 추가 될 때마다를 광석을 제거 했으므로 다시 채워야합니다. 전화 :

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

문제는 매우 자주 발생하기 때문에 UI를 울립니다. 더 효율적으로 구현하려면 더 나은 구현이 필요하다고 생각합니다.

은 내가 백그라운드에서 활성화 된 항목의 목록을 유지하고 간헐적으로 실제 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