JTableHeaderに追加された各TableColumnの表示・非表示を切り替える
Total: 4109
, Today: 9
, Yesterday: 5
Posted by aterai at
Last-modified:
Comment
JTableHeader
のTableColumn
が表示・非表示状態かをJCheckBoxMenuItem
を使用して切り替えます。
Screenshot

Advertisement
Comment
class TableHeaderPopupMenu extends JPopupMenu {
protected TableHeaderPopupMenu(JTable table) {
super();
TableColumnModel columnModel = table.getColumnModel();
List<TableColumn> list = Collections.list(columnModel.getColumns());
list.forEach(tableColumn -> {
String name = Objects.toString(tableColumn.getHeaderValue());
// System.out.format("%s - %s%n", name, tableColumn.getIdentifier());
JCheckBoxMenuItem item = new JCheckBoxMenuItem(name, true);
item.addItemListener(e -> {
if (((AbstractButton) e.getItemSelectable()).isSelected()) {
columnModel.addColumn(tableColumn);
} else {
columnModel.removeColumn(tableColumn);
}
updateMenuItems(columnModel);
});
add(item);
});
}
@Override public void show(Component c, int x, int y) {
if (c instanceof JTableHeader) {
JTableHeader header = (JTableHeader) c;
JTable table = header.getTable();
header.setDraggedColumn(null);
header.repaint();
table.repaint();
updateMenuItems(header.getColumnModel());
super.show(c, x, y);
}
}
private void updateMenuItems(TableColumnModel columnModel) {
boolean isOnlyOneMenu = columnModel.getColumnCount() == 1;
if (isOnlyOneMenu) {
stream(this).map(MenuElement::getComponent).forEach(mi ->
mi.setEnabled(!(mi instanceof AbstractButton)
|| !((AbstractButton) mi).isSelected()));
} else {
stream(this).forEach(me -> me.getComponent().setEnabled(true));
}
}
private static Stream<MenuElement> stream(MenuElement me) {
return Stream.of(me.getSubElements())
.flatMap(m -> Stream.concat(Stream.of(m), stream(m)));
}
}
View in GitHub: Java, Kotlin