• category: swing folder: RightSideRowHeader title: JScrollPaneの行ヘッダを右側に変更する tags: [JScrollPane, JScrollBar, JTable, ScrollPaneLayout, LayoutManager] author: aterai pubdate: 2018-09-10T16:22:14+09:00 description: JScrollPaneのレイアウトマネージャを使用して、行ヘッダをデフォルトの左側から右側に変更します。 image: https://drive.google.com/uc?id=1va-Vod9bidZfMkBZEMw6jIu8TQWjxNk5Mg

概要

JScrollPaneのレイアウトマネージャを使用して、行ヘッダをデフォルトの左側から右側に変更します。

サンプルコード

class RightFixedScrollPaneLayout extends ScrollPaneLayout {
  @Override public void layoutContainer(Container parent) {
    // ...

    // if (leftToRight) {
    //   rowHeadR.x = availR.x;
    //   availR.x += rowHeadWidth;
    // } else {
    //   rowHeadR.x = availR.x + availR.width;
    // }
    rowHeadR.x = availR.x + availR.width;

    // ...

    // adjustForVSB(vsbNeeded, availR, vsbR, vpbInsets, leftToRight);
    adjustForVSB(vsbNeeded, rowHeadR, vsbR, vpbInsets, leftToRight);
View in GitHub: Java, Kotlin

解説

  • JScrollPane#setRowHeaderView(...)で行ヘッダを設定した場合、デフォルト(ComponentOrientation.LEFT_TO_RIGHT)では左側に配置される
    • 以下のような設定で行ヘッダを右側に配置可能だが、垂直JScrollBarが左側になる
      table.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
      scroll.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
      scroll.setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, fixedTable.getTableHeader());
      
  • ScrollPaneLayout#layoutContainer(...)メソッドをオーバーライドして、行ヘッダや垂直JScrollBarの位置を直接変更する
    • 行ヘッダの位置: ComponentOrientation.RIGHT_TO_LEFTが設定されている場合と同じになるよう修正
    • 垂直JScrollBarの位置: adjustForVSB(...)メソッドの引数にJViewportではなく行ヘッダのRectangleを渡すよう修正
      • このため、JViewportの右側ではなく行ヘッダの右側に垂直JScrollBarが配置され、JViewportの幅ではなく行ヘッダの幅が垂直JScrollBarの幅だけ縮小される

参考リンク

コメント