JPanel을 확장하는 클래스 (타임 라인)가 있습니다. 타임 라인 패널에는 수동으로 배치 된 여러 개의 JLabel (녹색 및 주황색 요소)이 있습니다 ("널 레이아웃"). 타임 라인 상단에는 몇 개월 간의 전환을위한 버튼이 있습니다. 때로는 월간 전환 할 때 스윙이 JLabel을 그리지 않지만 항상 그리드 배경을 칠합니다.스윙의 페인팅
나는 이미 많은 "마법"메서드 (다시 그리기, revalidate, invalidate, validate, updateUI)를 시도했다.
성공적으로 그린 타임 라인 :
실패 그림 :
짧은 예 : 대안으로
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);
}
}
를 그림에 실패, 당신은 당신의 관련 페인트/paintComponent에 메소드가 호출되었는지 여부를 확인 했는가? – ARRG
@endian 필자는 결코 그것을 보지 못했다. Insets ??? – mKorbel
JLabels의 paintComponent 메소드가 호출되지 않는다. – endian