TITLE:JListを選択不可にする
#navi(../)
RIGHT:Posted by [[terai]] at 2005-03-14
*JListを選択不可にする [#j04d5de5]
JListを選択出来ないように設定します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#g97b104e]
#code{{
list2.setFocusable(false);
list2.setSelectionModel(new DefaultListSelectionModel() {
  public boolean isSelectedIndex(int index) {
    return false;
  }
});

class EmptySelectionRenderer implements ListCellRenderer {
  private final ListCellRenderer renderer;
  public EmptySelectionRenderer(ListCellRenderer renderer) {
    this.renderer = renderer;
  }
  public Component getListCellRendererComponent(
                     JList list, Object value, int index, 
                     boolean isSelected, boolean cellHasFocus) {
    return renderer.getListCellRendererComponent(
                        list, value, index, false, false);
  }
}
}}

**解説 [#a0f3861e]
-左
--JList#setEnabled(false)で選択不可にしています。
-中
--JList#setFocusable(false)でフォーカス無し、かつListSelectionModel#isSelectedIndexが常にfalseなセレクションモデルを設定して、選択不可にしています。
-右
--常に各セルを選択状態でもフォーカスも無いものとして描画するセルレンダラーを設定して、選択不可のように見せかけています。

----
LnFがNimbusの場合、以下のような方法もあまります。
#code{{
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.*;
public class DisabledTextForegroundList {
  public JComponent makeUI() {
    JList list = new JList(makeTestModel());
    //list.putClientProperty("Nimbus.Overrides", d);
    //list.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
    list.setEnabled(false);
    JSplitPane p = new JSplitPane();
    p.setLeftComponent(new JScrollPane(new JList(makeTestModel())));
    p.setRightComponent(new JScrollPane(list));
    p.setResizeWeight(.5);
    return p;
  }
  private static ListModel makeTestModel() {
    DefaultListModel m = new DefaultListModel();
    m.addElement("aaaaaaaaaaaa"); m.addElement("bbbbb");
    return m;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() { createAndShowGUI(); }
    });
  }
  public static void createAndShowGUI() {
    try {
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels())
        if ("Nimbus".equals(laf.getName()))
          UIManager.setLookAndFeel(laf.getClassName());
      //UIDefaults d = new UIDefaults();
      UIDefaults d = UIManager.getLookAndFeelDefaults();
      d.put("List:\"List.cellRenderer\"[Disabled].textForeground",
            new ColorUIResource(Color.RED));
    } catch(Exception e) {
      e.printStackTrace();
    }
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new DisabledTextForegroundList().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
}}

**参考リンク [#df459cec]
-[[JListの任意のItemを選択不可にする>Swing/DisabledItem]]

**コメント [#b5251fbd]
#comment