• title: JTableの行高がJVeiwportの高さに合うまで調整する tags: [JTable, JVewport, JScrollPane] author: aterai pubdate: 2015-07-13T02:32:20+09:00 description: JTableの各行の高さ変更することで行数などに変更があっても、JVeiwportに余白が発生しないように調整します。

概要

JTableの各行の高さ変更することで行数などに変更があっても、JVeiwportに余白が発生しないように調整します。

サンプルコード

JTable table = new JTable(model) {
  int prevHeight = -1;
  int prevCount = -1;
  public void updateRowsHeigth(JViewport vport) {
    int height = vport.getExtentSize().height;
    int rowCount = getModel().getRowCount();
    int defautlRowHeight = height / rowCount;
    if ((height != prevHeight || rowCount != prevCount) && defautlRowHeight > 0) {
      int over = height - rowCount * defautlRowHeight;
      for (int i = 0; i < rowCount; i++) {
        int a = over-- > 0 ? i == rowCount - 1 ? over : 1 : 0;
        setRowHeight(i, defautlRowHeight + a);
      }
    }
    prevHeight = height;
    prevCount = rowCount;
  }
  @Override public void doLayout() {
    super.doLayout();
    Container p = SwingUtilities.getAncestorOfClass(JViewport.class, this);
    if (p instanceof JViewport) {
      updateRowsHeigth((JViewport) p);
    }
  }
};
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JViewportのサイズまでJTableの各セルをGridLayout風に同比率で拡大縮小するようJTable#doLayout()をオーバーライドしています。

  • 余白(高さ方向)の調整
    • JViewportの高さが変更されたり、行数の増減があった場合、行の高さをJTable#setRowHeight(...)で設定し直すことで、JViewportに余白が発生しないように調整

参考リンク

コメント