2012-01-24 4 views
0

JPanel을 확장하는 클래스 (타임 라인)가 있습니다. 타임 라인 패널에는 수동으로 배치 된 여러 개의 JLabel (녹색 및 주황색 요소)이 있습니다 ("널 레이아웃"). 타임 라인 상단에는 몇 개월 간의 전환을위한 버튼이 있습니다. 때로는 월간 전환 할 때 스윙이 JLabel을 그리지 않지만 항상 그리드 배경을 칠합니다.스윙의 페인팅

나는 이미 많은 "마법"메서드 (다시 그리기, revalidate, invalidate, validate, updateUI)를 시도했다.

성공적으로 그린 ​​타임 라인 :

Timeline succesful

실패 그림 :

Timeline failed

짧은 예 : 대안으로

public interface IDateSelectorRegistrar { 

    void addListener(DateSelectorListener listener); 

    void removeListener(DateSelectorListener listener); 
} 

public interface DateSelectorListener { 
    void dateChanged(Timestamp from, Timestamp to); 
} 

public interface ITimelineModel { 
    Timespan[] getTimespans(Timestamp from, Timestamp to); 
} 

public class Timespan { 
    private String title; 
    private Timestamp to; 
    private Timestamp from; 

    public Timespan(String title, Timestamp from, Timestamp to) { 
    this.title = title; 
    this.from = from; 
    this.to = to; 
    } 

    // setters and getters 
} 

public class TimelineLabel extends JLabel { 
    public TimelineLabel(Timespan timespan) { 
    super(timespan.getTitle()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
    // paint colored background 
    super.paintComponent(g); 
    } 
} 

public class Timeline extends JPanel { 

    public Timeline(final ITimelineModel model, IDateSelectorRegistrar registrar) { 
    registrar.addListener(new DateSelectorListener() { 
     public void dateChanged(Timestamp from, Timestamp to) { 
     Timeline.this.removeAll(); 
     Timespan[] timespans = model.getTimespans(from, to); 
     for(Timespan timespan : timespans) { 
      TimelineLabel label = new TimelineLabel(timespan); 
      Timeline.this.add(label); 
      // label positioning because of Timestamp object data 
     } 
     // repaint of timeline 
     Timeline.this.invalidate(); 
     Timeline.this.repaint(); 
     } 
    }); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     // paint background grid 
     super.paintComponent(g); 
    } 
} 
+0

를 그림에 실패, 당신은 당신의 관련 페인트/paintComponent에 메소드가 호출되었는지 여부를 확인 했는가? – ARRG

+0

@endian 필자는 결코 그것을 보지 못했다. Insets ??? – mKorbel

+0

JLabels의 paintComponent 메소드가 호출되지 않는다. – endian

답변

0

콜링 다음 방법 :

invalidate(); 
repaint(); 
validate();