- title: JTableに行ヘッダを追加
tags: [JTable, JList, JScrollPane]
author: aterai
pubdate: 2006-09-04
description: JTableを設定したJScrollPaneのRowHeaderViewに、JListで作成した行ヘッダを追加します。
概要
JTable
を設定したJScrollPane
のRowHeaderView
に、JList
で作成した行ヘッダを追加します。
Screenshot
サンプルコード
class RowHeaderList<E> extends JList<E> {
private final JTable table;
private final ListSelectionModel tableSelection;
private final ListSelectionModel rListSelection;
private int rollOverRowIndex = -1;
private int pressedRowIndex = -1;
public RowHeaderList(ListModel<E> model, JTable table) {
super(model);
this.table = table;
setFixedCellHeight(table.getRowHeight());
setCellRenderer(new RowHeaderRenderer<E>(table.getTableHeader()));
RollOverListener rol = new RollOverListener();
addMouseListener(rol);
addMouseMotionListener(rol);
tableSelection = table.getSelectionModel();
rListSelection = getSelectionModel();
}
class RowHeaderRenderer<E> extends JLabel
implements ListCellRenderer<E> {
private final JTableHeader header; // = table.getTableHeader();
public RowHeaderRenderer(JTableHeader header) {
super();
this.header = header;
this.setOpaque(true);
//this.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
this.setBorder(BorderFactory.createMatteBorder(
0, 0, 1, 2, Color.GRAY.brighter()));
this.setHorizontalAlignment(CENTER);
this.setForeground(header.getForeground());
this.setBackground(header.getBackground());
this.setFont(header.getFont());
}
@Override public Component getListCellRendererComponent(
JList<? extends E> list, E value, int index,
boolean isSelected, boolean cellHasFocus) {
if (index == pressedRowIndex) {
setBackground(Color.GRAY);
} else if (index == rollOverRowIndex) {
setBackground(Color.WHITE);
} else if (isSelected) {
setBackground(Color.GRAY.brighter());
} else {
setForeground(header.getForeground());
setBackground(header.getBackground());
}
setText(Objects.toString(value, ""));
return this;
}
}
//...
}
View in GitHub: Java, Kotlin
解説
上記のサンプルでは、JList
で作成した行ヘッダをJScrollPane
にsetRowHeaderView
メソッドで追加しています。
表の余白などに色がついているのは、テストの名残です。特に意味は無いのですが、そのまま残しています。
rowHeader.setBackground(Color.BLUE);
scrollPane.setBackground(Color.RED);
scrollPane.getViewport().setBackground(Color.GREEN);
参考リンク
コメント