概要

GraphicsのサブクラスであるDebugGraphicsを使用してJComponentの描画をデバッグします。

サンプルコード

String[] columnNames = {"String", "Integer", "Boolean"};
Object[][] data = {
    {"aaa", 12, true}, {"bbb", 5, false}, {"ccc", 92, true}
};
TableModel model = new DefaultTableModel(data, columnNames) {
  @Override public Class<?> getColumnClass(int column) {
    return getValueAt(0, column).getClass();
  }
};
JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);

RepaintManager repaintManager = RepaintManager.currentManager(table);
repaintManager.setDoubleBufferingEnabled(false);
table.setDebugGraphicsOptions(DebugGraphics.BUFFERED_OPTION
    | DebugGraphics.FLASH_OPTION
    | DebugGraphics.LOG_OPTION);
View in GitHub: Java, Kotlin

解説

  • JComponent#paintComponent(Graphics)などの描画で使用するGraphicsをそのサブクラスであるDebugGraphicsに変更して描画を数回赤色で点滅したり速度を遅くしてデバッグを行う
    • JComponent#setDebugGraphicsOptions(...)で以下のようなオプションを設定すれば自動的にDebugGraphicsが使用されるよう変更される
      • DebugGraphics.LOG_OPTION テキスト・メッセージを出力する
      • DebugGraphics.FLASH_OPTION 描画を数回点滅させる
      • DebugGraphics.BUFFERED_OPTION Viewのオフスクリーン・バッファで実行された処理を表示するExternalWindowを作成する
      • DebugGraphics.NONE_OPTION デバッグを無効にする
      • 値がゼロの場合はデバッグ・オプションを変更しない
  • DebugGraphicsを使用する場合、コンポーネントのダブルバッファリング設定をオフにする必要がある
    RepaintManager repaintManager = RepaintManager.currentManager(component);
    repaintManager.setDoubleBufferingEnabled(false);
    
  • 上記のサンプルではJTableの描画を遅くしてデバッグしている
    • デバッグ用に描画速度が遅くなるので、たとえばWindowsLookAndFeelでフォーカスボーダーの点線を描画すると1ドットごとにウェイトを入れて描画されるので長時間マウス操作などを受け付けなくなる

参考リンク

コメント