Swing/TableRowHeader のバックアップの現在との差分(No.3)
TITLE:JTableに行ヘッダを追加
JTableに行ヘッダを追加
編集者:Terai Atsuhiro~
作成日:2006-09-04
更新日:2022-09-27 (火) 17:29:54
- category: swing folder: TableRowHeader title: JTableに行ヘッダを追加 tags: [JTable, JList, JScrollPane] author: aterai pubdate: 2006-09-04T01:10:03+09:00 description: JTableを設定したJScrollPaneのRowHeaderViewに、JListで作成した行ヘッダを追加します。 image: hreflang:
href: https://java-swing-tips.blogspot.com/2011/01/jtable-rowheader.html lang: en
概要
JTable
を設定したJScrollPane
のRowHeaderView
に、JList
で作成した行ヘッダを追加します。
Screenshot
Advertisement
概要
JTableに行ヘッダを追加を追加します。サンプルコード
#spanend
#spanadd
class RowHeaderList<E> extends JList<E> {
#spanend
private final JTable table;
private final ListSelectionModel tableSelection;
private final ListSelectionModel rListSelection;
private int rollOverRowIndex = -1;
private int pressedRowIndex = -1;
#spandel
#screenshot
#spanend
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);
#spandel
**サンプルコード [#kfa64240]
#spanend
class RowHeaderList extends JList {
private final JTable table;
private final ListSelectionModel tableSelection;
private final ListSelectionModel rListSelection;
public RowHeaderList(ListModel model, JTable table) {
super(model);
this.table = table;
setFixedCellHeight(table.getRowHeight());
setCellRenderer(new RowHeaderRenderer(table.getTableHeader()));
RollOverListener rol = new RollOverListener();
addMouseListener(rol);
addMouseMotionListener(rol);
tableSelection = table.getSelectionModel();
rListSelection = getSelectionModel();
}
class RowHeaderRenderer extends JLabel implements ListCellRenderer {
private final JTableHeader header;
public RowHeaderRenderer(JTableHeader header) {
this.header = header;
this.setOpaque(true);
//this.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
this.setBorder(BorderFactory.createMatteBorder(0,0,1,2,Color.gray));
this.setHorizontalAlignment(CENTER);
this.setForeground(header.getForeground());
this.setBackground(header.getBackground());
this.setFont(header.getFont());
}
public Component getListCellRendererComponent(JList list, Object 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((value==null)?"":value.toString());
return this;
}
}
}
tableSelection = table.getSelectionModel();
rListSelection = getSelectionModel();
}
-&jnlp;
-&jar;
-&zip;
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());
}
#spandel
**解説 [#z757f120]
#spanend
#spandel
上記のサンプルでは、JListで作成した行ヘッダをJScrollPaneにsetRowHeaderViewメソッドで追加しています。
#spanend
@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;
}
}
// ...
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, KotlinrowHeader.setBackground(Color.blue); scrollPane.setBackground(Color.red); scrollPane.getViewport().setBackground(Color.green);
解説
上記のサンプルでは、JList
で作成した行ヘッダをJScrollPane#setRowHeaderView(...)
メソッドで追加しています。
参考リンク
- JTable Examples
- Java Technology Forums - excel styled table?
- JListのセルをカーソル移動でロールオーバー
- -
-
Corner
:JScrollPane.html#setCorner(...)
で左上隅などにコンポーネントを設定しておらずJScrollPane
自体の背景色(赤)が表示されている -
Viewport
:JTable
のセルが存在しない領域はJViewport
の背景色(緑)が表示されている
コメント
- 不正なセルレンダラーを設定していたので修正しました。 -- terai
#spanend #spanadd rowHeader.setBackground(Color.BLUE); #spanend #spanadd scrollPane.setBackground(Color.RED); #spanend #spanadd scrollPane.getViewport().setBackground(Color.GREEN); #spanend #spanadd