概要

JListのスクロールバーをマウスでドラッグした場合、セルの上辺を固定したユニット単位のスクロールかなめらなかにスクロールするかを設定します。

スクリーンショット

Swing/LockToPositionOnScroll.png

サンプルコード

String key = "List.lockToPositionOnScroll";
// UIManager.put(key, Boolean.FALSE);

DefaultListModel<String> model = new DefaultListModel<>();
IntStream.range(0, 1000).mapToObj(Objects::toString).forEach(model::addElement);
JList<String> list = new JList<String>(model) {
  @Override public void updateUI() {
    setCellRenderer(null);
    super.updateUI();
    ListCellRenderer<? super String> renderer = getCellRenderer();
    setCellRenderer((list, value, index, isSelected, cellHasFocus) -> {
      Component c = renderer.getListCellRendererComponent(
          list, value, index, isSelected, cellHasFocus);
      if (isSelected) {
        c.setForeground(list.getSelectionForeground());
        c.setBackground(list.getSelectionBackground());
      } else {
        c.setForeground(list.getForeground());
        c.setBackground(index % 2 == 0 ? EVEN_BACKGROUND : list.getBackground());
      }
      return c;
    });
  }
};
list.setFixedCellHeight(64);

JCheckBox check = new JCheckBox(key, UIManager.getBoolean(key));
check.addActionListener(e -> UIManager.put(key, ((JCheckBox) e.getSource()).isSelected()));
view all

解説

  • WindowsLookAndFeel
    • デフォルトはUIManager.getBoolean("List.lockToPositionOnScroll") == Boolean.TRUEでセルの上辺を固定したユニット単位のスクロール
    • ホイールスクロールや矢印ボタンのクリック、カーソルキーなどのスクロールはList.lockToPositionOnScrollの設定は影響しない
  • BasicLookAndFeel
    • デフォルトはUIManager.getBoolean("List.lockToPositionOnScroll") == Boolean.FALSEでなめらかにスクロール
    • MetalLookAndFeelUIManager.put("List.lockToPositionOnScroll", Boolean.TRUE)を設定するとスクロールバーのマウスドラッグでもユニット単位のスクロールが可能
  • NumbusLookAndFeel
    • List.lockToPositionOnScrollの設定は影響せず、スクロールバーのマウスドラッグはなめらかでもセルの上辺を固定したユニット単位のスクロールではなく、ホイールスクロールや矢印ボタンのクリックと同じスクロールになる

参考リンク

コメント