JTable の簡単な使い方

Java の Swing におけるグリッドデータ表示は JTable コンポーネントで行います。

JTable は表をスクロールするために JScrollPane と組み合わせて使います。 ここでは順番に、JScrollPane を使わないときに発生する問題点を含めてみていきましょう。

まずは非常に単純なところから始めます。

下のコードでは JTable に表示するデータを Object の二次元配列である data という変数で保持しています。 また、カラム名は String の配列である columns という変数に設定しています。

package com.keicode.java.testapp;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class TableTest10 extends JFrame {
  
  Object[][] data = {
      {"X", "100", true},
      {"X", "200", false},
      {"X", "300", false},
      {"Y", "400", false},
      {"Y", "500", false},
      {"Z", "600", false},
      {"Z", "700", false}};
  
  String[] columns = {"Column 0", "Column 1", "Column 2"};
  
  public TableTest10() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(350, 150);

    JTable table = new JTable(data, columns);
    add(table);    
  }
  
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        TableTest10 app = new TableTest10();
        app.setVisible(true);
      }
    });
  }
  
}

この結果は次のような画面になりました。

データとカラム名をこのように配列として持っておき、JTable のコンストラクタに渡すことでデータの内容を表示することができます。

カラムヘッダーの表示は?

しかしながら、上のスクリーンショットをよくみると、データはとりあえず表示されているといって良いと思いますが、 ヘッダーが全く表示されていません

カラムヘッダーはどのように表示すればよいでしょうか?

JTable では、ヘッダーコンポーネントに getTableHeader() メソッドでアクセスできます。 これを利用すると、次のように書き直すことができます。

package com.keicode.java.testapp;

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class TableTest11 extends JFrame {
  
  Object[][] data = {
      {"X", "100", true},
      {"X", "200", false},
      {"X", "300", false},
      {"Y", "400", false},
      {"Y", "500", false},
      {"Z", "600", false},
      {"Z", "700", false}};
  
  String[] columns = {"Column 0", "Column 1", "Column 2"};
  
  public TableTest11() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    setSize(350, 150);

    JTable table = new JTable(data, columns);
    add(table.getTableHeader(), BorderLayout.NORTH);
    add(table);    
  }
  
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        TableTest11 app = new TableTest11();
        app.setVisible(true);
      }
    });
  }
  
}

この結果は次のようになります。

確かにカラムヘッダーが表示され、"Column 0"、"Column 1"、・・・と表示されています。

レイアウトマネージャとして、ここでは BorderLayout を設定して、ヘッダー部分を上部 (NORTH) にセットしています。

これで OK、と行きたいところですが、実はまだ問題があります。

ウィンドウのフレームをリサイズして小さくすると、次のようにテーブルが途中で切れてしまっています。

このくらいデータ量が少なければ、ウィンドウを大きくすれば全部のデータが確認できるので問題ありませんが、 データ量が増えれば下の方はみえなくなってしまい、これでは使い物になりません。

スクロールバーを表示して、画面のサイズに関わらずデータ全体を表示できるようにしましょう

JScrollPane と組み合わせて使う

以上、ヘッダーの表示問題とデータ部分のスクロール問題の両方を一度に解決する方法として、JScrollPane を使います。

JScrollPane を使うとヘッダー部分を画面上部に取りおき、データ部分はスクロールするようになります。

package com.keicode.java.testapp;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class TableTest12 extends JFrame {
  
  Object[][] data = {
      {"X", "100", true},
      {"X", "200", false},
      {"X", "300", false},
      {"Y", "400", false},
      {"Y", "500", false},
      {"Z", "600", false},
      {"Z", "700", false}};
  
  String[] columns = {"Column 0", "Column 1", "Column 2"};
  
  public TableTest12() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(350, 150);

    JTable table = new JTable(data, columns);
    JScrollPane scrollPane = new JScrollPane(table);
    
    add(scrollPane);    
  }
  
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        TableTest12 app = new TableTest12();
        app.setVisible(true);
      }
    });
  }
}

この結果は次のようになります。

確かに、ヘッダーが上部に固定表示され、データ部分にスクロールバーが表示されています。

JScrollPane のコンストラクタに JTable を渡していることに注意してください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門