概要

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

サンプルコード

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, check.isSelected()));
View in GitHub: Java, Kotlin

解説

  • 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の設定は影響せず、スクロールバーのマウスドラッグはなめらかでもセルの上辺を固定したユニット単位のスクロールではなく、ホイールスクロールや矢印ボタンのクリックと同じスクロールになる

参考リンク

コメント