2011-12-01 11 views
9

में आइटम अक्षम करें मैं एक जेडिस्ट का उपयोग विज़ार्ड के हिस्से के रूप में करने के लिए सभी चरणों को प्रदर्शित करने के लिए कर रहा हूं (यह इसे जाने के लिए एक कदम पर क्लिक करने की अनुमति देता है)। पिछले चरणों में किए गए कार्यों के आधार पर कुछ कदमों की हमेशा आवश्यकता नहीं होगी। यह इन लागू चरणों में मैं सूची में अक्षम करना चाहता हूं।जेएलिस्ट

मैं कैसे सूची में कुछ वस्तुओं (के चयन को रोकने) अक्षम करने के बारे जा सकते हैं? क्या जेएलिस्ट को उपclassing और हर चयन से संबंधित विधि को ओवरराइड करने से बेहतर तरीका है?

उत्तर

15

आप DefaultListSelectionModel लागू करता है करने के लिए है, तो आप फ्लैग सेट कर सकते हैं यदि IsEnabled या नहीं

enter image description here

सरल उदाहरण

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; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

चरण "सक्षम" करने के लिए कौन सी कार्रवाइयां आवश्यक हैं, यह एक अच्छा जवाब है जब आप अक्षम दिखाना चाहते हैं आइटम नहीं है। कुछ उपयोग मामले हैं जहां वास्तव में ऐसा करना बेहतर होता है। मेरे पास ऐसा उपयोग मामला है और यह एक आकर्षण की तरह काम करता है। –

3

यह आसान है, तो आप के बजाय उन्हें अक्षम की सूची मॉडल से अयोग्य आइटम निकाल दिए गए, किया जाएगा। क्या उपयोगकर्ता वास्तव में विकलांग वस्तुओं को देखना चाहते हैं? मुझे विश्वास नहीं है कि यह कोई मूल्य जोड़ता है, लेकिन इसके बजाय दृश्य अव्यवस्था जोड़ता है।

+1

यह एक अच्छा बिंदु है। कुछ विचारों के बाद मैंने उन्हें भूरे रंग का फैसला करने का फैसला किया लेकिन उन्हें चुनने की अनुमति दी। अगली/पिछली बार उपयोग करते समय उन्हें छोड़ दिया जाता है, लेकिन यदि वे जानबूझकर एक ग्रेड-आउट चरण पर जाते हैं तो यह संदेश होगा कि चरण –

1

एक समाधान: आप में AbstractAction को देखने के लिए चाहते हो सकता है जावा एपीआई फिर, COMMAND पैटर्न लागू करें।

विचार तरीकों दे रहा है उन्हें कक्षाओं (जो AbstractAction लागू) में बनाकर कहा गया है। फिर, वे एक-दूसरे को अक्षम कर सकते हैं।

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

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

1

मैं कोशिकाओं है कि चयन नहीं हो सकता है और पारदर्शी थे सकता है के साथ एक JList चाहता था। तो यहां मैंने जो किया है:

class DisabledItemListCellRenderer extends JLabel implements ListCellRenderer<Object> { 

    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; 
    }  
} 
संबंधित मुद्दे