0

JPanel を拡張するクラス (タイムライン) があります。タイムライン パネルには、手動で配置された多くの JLabels (緑とオレンジの要素) が含まれています ("null-Layout")。タイムラインの上部には、月を切り替えるためのボタンがいくつかあります。月を切り替えると、swing が JLabels を描画せず、常にグリッドの背景を描画することがあります。

私はすでに多くの「魔法の」方法(再描画、再検証、無効化、検証、更新UI)を試しました。

タイムラインの描画に成功しました:

タイムライン成功

塗装失敗:

タイムラインに失敗しました

簡単な例:

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);
   }
}
4

2 に答える 2

2

代わりに、org.jfree.chart.renderer.category.GanttRenderer時間領域グラフに最適で、さまざまなカスタマイズが可能な を検討してください。以下に示す例は、ここにあります。

ガント サブタスク

于 2012-01-24T20:10:11.273 に答える
0

次のメソッドを次の順序で呼び出すと、問題が修正されました。

invalidate();
repaint();
validate();
于 2012-03-01T09:25:16.627 に答える