September 14th, 2008
대만에서 마셨던 맥주

beer

문득 대만 컴퓨텍스 출장가서 대낮에 마셨던 맥주가 생각났다.
잔도 참 예쁜데 맛도 좋더라는..
자리가 모자라서 다들 합석. 뒤에 비친 저 남자분의 이름도 국적도 모른다.

September 6th, 2008
JComponent의 Drawing Optimization

JComponent.isOptimizedDrawingEnabled()라는 메소드가 있다.

보통은 호출할 일도 없고 재정의 할 일도 없어서 외면 받는 메소드중의 하나다.

자식(후손말고) 컴포넌트들이 서로 겹치는 부분이 없는것이 보장되는 경우 true를 반환하고 아니면 false를 반환하도록 구현하면된다. 기본적으로 JComponent는 무조건 true 주도록 구현되어있다.

다시 말하면 자식끼리 지리적으로 겹치는 영역이 있는데도 true를 반환토록 놔두면 오동작해도 찍소리 못한다는 것이다.

반투명한  Panel을 JList 위에 곂치게 둔 예제에서 isOptimizedDrawingEnabled()가 true를 반환하도록 그냥 두면 아래의 영상처럼 오동작 한다.

같은 코드에서 isOptimizedDrawingEnabled()가 false를 반환토록 하면 다음 처럼 잘 굴러간다.

JAVA:
  1. public class OptimizaedDrawingSample extends JPanel {
  2.     private JPanel glass = null;
  3.     public OptimizaedDrawingSample(JComponent child) {
  4.         glass = new JPanel(new BorderLayout()) {
  5.             @Override protected void paintComponent(Graphics g) {
  6.                 g.setColor(new Color(0, 255, 0, 128));
  7.                 g.fillRect(0, 0, getWidth(), getHeight());
  8.             }
  9.         };
  10.         glass.setOpaque(false);
  11.         add(glass);
  12.         add(BorderLayout.CENTER, child);
  13.     }
  14.  
  15.     @Override public void doLayout() {
  16.         super.doLayout(); // cover whole component
  17.         glass.setBounds(0, 0, getWidth(), getHeight());
  18.     }
  19.  
  20.     @Override public boolean isOptimizedDrawingEnabled() {
  21.         return false;
  22.     }
  23.  
  24.     private static JList createSampleList() {
  25.         Vector data = new Vector();
  26.         for(int i=0;i<20;i++) {
  27.             data.add(new Date());
  28.         }
  29.         JList result = new JList(data);
  30.         return result;
  31.     }
  32.  
  33.     public static void main(String[] args) {
  34.         JFrame frame = new JFrame("Optimized Drawing Error Sample");
  35.         frame.add(new OptimizaedDrawingSample( createSampleList() ));
  36.         frame.pack();
  37.         frame.setVisible(true);
  38.     }
  39. }

Source code download