Swing/EmptySelectionList の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/EmptySelectionList へ行く。
- Swing/EmptySelectionList の差分を削除
--- category: swing folder: EmptySelectionList title: JListを選択不可にする tags: [JList, ListCellRenderer, ListSelectionModel] author: aterai pubdate: 2005-03-14T14:24:03+09:00 description: JListのセルアイテムをマウスクリックで選択不可に設定します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTMI697_II/AAAAAAAAAYs/EhpPEXnw1bc/s800/EmptySelectionList.png --- * 概要 [#summary] `JList`のセルアイテムをマウスクリックで選択不可に設定します。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTMI697_II/AAAAAAAAAYs/EhpPEXnw1bc/s800/EmptySelectionList.png) * サンプルコード [#sourcecode] #code(link){{ list2.setFocusable(false); list2.setSelectionModel(new DefaultListSelectionModel() { @Override public boolean isSelectedIndex(int index) { return false; } }); class EmptySelectionRenderer implements ListCellRenderer { private final ListCellRenderer renderer; public EmptySelectionRenderer(ListCellRenderer renderer) { this.renderer = renderer; } @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { return renderer.getListCellRendererComponent( list, value, index, false, false); } } }} * 解説 [#explanation] - 左 -- `JList#setEnabled(false)`で編集不可にしているためアイテムの選択も不可になる -- 文字色が薄くなる - 中 -- `JList#setFocusable(false)`でフォーカス無し、かつ`ListSelectionModel#isSelectedIndex(...)`が常に`false`なセレクションモデルを使用して選択不可に設定 -- `JList#setFocusable(false)`でフォーカス無効化、かつ`ListSelectionModel#isSelectedIndex(...)`が常に`false`なセレクションモデルを使用して選択不可に設定 - 右 -- 常に各セルを選択状態でもフォーカスも無いものとして描画するセルレンダラーを使用して選択不可に見せかける -- 常に各セルを選択状態でもフォーカスも無いものとして描画するセルレンダラーを使用して選択不可に見せかけている ---- - `LookAndFeel`が`Nimbus`の場合編集不可にした`JList`の文字色を以下のような方法で変更可能 #code{{ // package example; import java.awt.*; import javax.swing.*; import javax.swing.plaf.*; public class MainPanel { public JComponent makeUI() { JList<String> 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<String> makeTestModel() { DefaultListModel<String> m = new DefaultListModel<>(); m.addElement("1234567890"); m.addElement("aaa"); return m; } public static void main(String[] args) { EventQueue.invokeLater(MainPanel::createAndShowGUI); } public static void createAndShowGUI() { try { UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); // 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 MainPanel().makeUI()); f.setSize(320, 240); f.setLocationRelativeTo(null); f.setVisible(true); } } }} * 参考リンク [#reference] - [[JListの任意のItemを選択不可にする>Swing/DisabledItem]] * コメント [#comment] #comment #comment