禁用JList中的项目

我正在使用JList作为向导的一部分来显示要执行的所有步骤(它还允许单击要转到它的步骤)。 根据之前步骤中的操作,并不总是需要一些步骤。 这是我想在列表中禁用的这些不适用的步骤。

如何禁用(阻止选择)列表中的某些项目? 有没有比inheritanceJList和覆盖每个与选择相关的方法更好的方法?

你必须实现DefaultListSelectionModel ,然后你可以设置标志isEnabled与否

在此处输入图像描述

简单的例子

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JListDisabledItemDemo implements ItemListener, Runnable { private JFrame f = new JFrame("Colors"); private static final String ITEMS[] = {" black ", " blue ", " green ", " orange ", " purple ", " red ", " white ", " yellow "}; private JList jList; private JCheckBox[] checkBoxes; private boolean[] enabledFlags; @Override public void run() { JPanel pnlEnablers = new JPanel(new GridLayout(0, 1)); pnlEnablers.setBorder(BorderFactory.createTitledBorder("Enabled Items")); checkBoxes = new JCheckBox[ITEMS.length]; enabledFlags = new boolean[ITEMS.length]; for (int i = 0; i < ITEMS.length; i++) { checkBoxes[i] = new JCheckBox(ITEMS[i]); checkBoxes[i].setSelected(true); checkBoxes[i].addItemListener(this); enabledFlags[i] = true; pnlEnablers.add(checkBoxes[i]); } jList = new JList(ITEMS); jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jList.setSelectionModel(new DisabledItemSelectionModel()); jList.setCellRenderer(new DisabledItemListCellRenderer()); jList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { System.out.println("selection"); } } }); JScrollPane scroll = new JScrollPane(jList); scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); Container contentPane = f.getContentPane(); contentPane.setLayout(new GridLayout(1, 2)); contentPane.add(pnlEnablers); contentPane.add(scroll); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocation(240, 280); UIManager.put("List.background", Color.lightGray); UIManager.put("List.selectionBackground", Color.orange); UIManager.put("List.selectionForeground", Color.blue); UIManager.put("Label.disabledForeground", Color.magenta); SwingUtilities.updateComponentTreeUI(f); f.pack(); javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { f.setVisible(true); } }); } @Override public void itemStateChanged(ItemEvent event) { JCheckBox checkBox = (JCheckBox) event.getSource(); int index = -1; for (int i = 0; i < ITEMS.length; i++) { if (ITEMS[i].equals(checkBox.getText())) { index = i; break; } } if (index != -1) { enabledFlags[index] = checkBox.isSelected(); jList.repaint(); } } public static void main(String args[]) { SwingUtilities.invokeLater(new JListDisabledItemDemo()); } private class DisabledItemListCellRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component comp = super.getListCellRendererComponent(list, value, index, false, false); JComponent jc = (JComponent) comp; if (enabledFlags[index]) { if (isSelected & cellHasFocus) { comp.setForeground(Color.black); comp.setBackground(Color.red); } else { comp.setForeground(Color.blue); } if (!isSelected) { if ((value.toString()).trim().equals("yellow")) { comp.setForeground(Color.orange); comp.setBackground(Color.magenta); } } return comp; } comp.setEnabled(false); return comp; } } private class DisabledItemSelectionModel extends DefaultListSelectionModel { private static final long serialVersionUID = 1L; @Override public void setSelectionInterval(int index0, int index1) { if (enabledFlags[index0]) { super.setSelectionInterval(index0, index0); } else { /* * The previously selected index is before this one, * so walk forward to find the next selectable item. */ if (getAnchorSelectionIndex() < index0) { for (int i = index0; i < enabledFlags.length; i++) { if (enabledFlags[i]) { super.setSelectionInterval(i, i); return; } } } /* * Otherwise, walk backward to find the next selectable item. */ else { for (int i = index0; i >= 0; i--) { if (enabledFlags[i]) { super.setSelectionInterval(i, i); return; } } } } } } } 

如果从列表模型中删除不适用的项目而不是禁用它们会更容易。 用户真的想看到禁用的物品吗? 我不相信它会增加任何价值,反而增加了视觉上的混乱。

一种解决方案:您可能希望在Java API中查找AbstractAction。 然后,实现COMMAND模式。

我们的想法是通过将方法设置为类(实现AbstractAction)来赋予方法状态。 然后,他们可以互相禁用。

http://en.wikipedia.org/wiki/Command_pattern

http://docs.oracle.com/javase/6/docs/api/

我想要一个JList,其单元格无法选择并且是透明的。 所以这就是我做的:

 class DisabledItemListCellRenderer extends JLabel implements ListCellRenderer { private static final long serialVersionUID = 1L; public DisabledItemListCellRenderer() { setOpaque(false); } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String txt = (String) value; setText(txt); return this; } }