• category: swing folder: TableScrollPaneBorder title: JTableが配置されたJScrollPaneのBorderを変更する tags: [JTable, Border, JScrollPane, UIManager, LookAndFeel] author: aterai pubdate: 2022-12-26T00:29:57+09:00 description: JTableが配置されたJScrollPaneに適用されるBorderをまとめて変更します。 image: https://drive.google.com/uc?id=1xoD1g3KbpKqnDrtB-PKy5XMrZzAjsynn

概要

JTableが配置されたJScrollPaneに適用されるBorderをまとめて変更します。

サンプルコード

JScrollPane scroll = new JScrollPane(table);
// scroll.setBorder(new BorderUIResource(BorderFactory.createLineBorder(Color.BLUE, 5)));
String key = "Table.scrollPaneBorder";
JCheckBox check = new JCheckBox(key, Objects.nonNull(UIManager.getBorder(key))) {
  @Override public void updateUI() {
    super.updateUI();
    boolean b = Objects.nonNull(UIManager.getLookAndFeelDefaults().getBorder(key));
    updateTableScrollPane(scroll, key, b);
    setSelected(b);
  }
};
check.addActionListener(e -> {
  boolean b = ((JCheckBox) e.getSource()).isSelected();
  updateTableScrollPane(scroll, key, b);
});
// ...
public static void updateTableScrollPane(Component scroll, String key, boolean lnf) {
  Border border;
  if (lnf) {
    border = UIManager.getLookAndFeelDefaults().getBorder(key);
  } else {
    border = new BorderUIResource(BorderFactory.createEmptyBorder());
  }
  UIManager.put(key, border);
  SwingUtilities.updateComponentTreeUI(scroll);
}
View in GitHub: Java, Kotlin

解説

上記のサンプルではUIManager.put("Table.scrollPaneBorder", ...)を使用してJTableが配置されたJScrollPaneに適用されるBorderLookAndFeel固有のBorderと空のBorderFactory.createEmptyBorder()で切り替えるテストを実行しています。

  • UIManager.put("Table.scrollPaneBorder", ...)で適用されるBorderは個別のJScrollPaneJScrollPane#setBorder(...)で変更可能なBorderとなる
  • NimbusLookAndFeelUIManager.getLookAndFeelDefaults().getBorder("Table.scrollPaneBorder")で取得できるBordernullだが、JScrollPaneBorderは別のPainterで描画される
  • MotifLookAndFeelUIManager.getLookAndFeelDefaults().getBorder("Table.scrollPaneBorder")で取得できるBordernullJScrollPaneBorderは描画されない

参考リンク

コメント