JavaでJTableのヘッダー(JTableHeader)にワードラップを実装する方法
JTableHeaderとは
- JTableHeaderは、JComponentクラスのサブクラスです。
- JTableオブジェクトを生成すると、コンストラクタが自動的に新しいJTableHeaderオブジェクトを作成し、テーブルコンポーネントのヘッダーを管理します。
- JTableHeaderオブジェクトはテーブルのカラムモデル(column model)と関連付けられており、これによりUIデリゲートが列のドラッグ操作や各列のヘッダーセルの描画を行えるようになっています。
- JTableクラスは、テーブルヘッダーとしてJTableHeaderオブジェクトを設定するためのsetTableHeader()メソッドと、そのオブジェクトへの参照を取得するgetTableHeader()メソッドを提供しています。
JTableのヘッダーにワードラップ(折り返し表示)を実装したい場合は、DefaultTableModelクラスまたはAbstractTableModelクラスをカスタマイズすることで実現できます。ポイントは、列名をHTML形式の文字列(<html>タグで囲んだ文字列)として返すようにすることです。SwingのコンポーネントはHTMLレンダリングに対応しているため、これによりヘッダーテキストが自動的に折り返されるようになります。
実装例
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class WordWrappingTableHeaderTest extends JFrame {
private JTable table;
public WordWrappingTableHeaderTest() {
setTitle("WordWrappingTableHeader Test");
DefaultTableColumnModel tableColumnModel = new DefaultTableColumnModel() {
public void addColumn(TableColumn column) {
column.setHeaderRenderer(new JTableHeader().getDefaultRenderer());
super.addColumn(column);
}
};
table = new JTable();
table.setFillsViewportHeight(true);
table.setColumnModel(tableColumnModel);
table.setModel(new DemoTableModel(Arrays.asList(
"Word Wrapping TableHeader Test",
"Word Wrapping TableHeader Test",
"Word Wrapping TableHeader Test"), 20));
add(new JScrollPane(table));
setSize(450, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
class DemoTableModel extends AbstractTableModel {
private ArrayList wrappedColumnNames = new ArrayList();
private int numRows;
DemoTableModel(List columnNames, int numRows) {
for (String name : (List<String>) columnNames)
wrappedColumnNames.add("<html>" + name + "</html>");
this.numRows = numRows;
}
public int getRowCount() {
return numRows;
}
public int getColumnCount() {
return wrappedColumnNames.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
return Integer.valueOf(10000 + (rowIndex + 1) * (columnIndex + 1));
}
public String getColumnName(int column) {
return (String) wrappedColumnNames.get(column);
}
public Class<?> getColumnClass(int columnIndex) {
return Integer.class;
}
}
public static void main(String[] args) {
new WordWrappingTableHeaderTest();
}
}コードのポイント
- DemoTableModelでは、コンストラクタで受け取った列名を「<html>〜</html>」で囲んでリストに格納しています。これにより、ヘッダーレンダラーがHTMLとして描画し、長いテキストが折り返されます。
- DefaultTableColumnModelを匿名クラスでオーバーライドし、
addColumn()時にデフォルトのヘッダーレンダラーを明示的に設定しています。 setFillsViewportHeight(true)を指定することで、ビューポート内の余白もテーブルが埋めるように表示されます。
出力結果

このプログラムを実行すると、各列のヘッダーに表示された長いテキストが折り返されて表示され、ウィンドウサイズに収まる形で描画されていることが確認できます。
-
JavaでJPanelのpaintComponent()メソッドを実装する方法をわかりやすく解説
JPanelはJavaにおける軽量コンテナであり、それ自体は不可視(インビジブル)なコンポーネントとして扱われます。デフォルトのレイアウトにはFlowLayoutが採用されています。JPanelを生成した後は、Containerクラスから継承されたadd()メソッドを呼び出すことで、ボタンやラベルなどの他のコンポーネントをJPanelオブジェクトに自由に追加できます。 paintComponent()メソッドとは このメソッドは、単なる背景色の描画にとどまらず、JPanel上に独自の図形や画像などを描画したい場合に必要となります。paintComponent()メソッドはすでにJPanelクラ
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー