2013-02-13 41 views
5

1.當用戶從JComboBox中選擇項目時,它們被添加到JTable中,我創建了JComboBox和Jtable。
2.我不想讓用戶選擇他以前在JComboBox中選擇的項目。
3.所選選項必須禁用(不可選)。我應該怎麼做?下面的代碼4.刪除所選的JComboBox從項目已在JTable中添加了之後,但我感興趣的禁用它在運行時禁用JComboBox項目

 String getchoice=(String)selectedgames_combobox.getSelectedItem(); 

     DefaultTableModel gamesmodel = new DefaultTableModel(); 

     //adding selected choices from JComboBox in JTable 
     gamesmodel.addColumn("Selected Games");  
     gamesmodel.insertRow(gamesmodel.getRowCount(),new Object[]{ getchoice }) ; 

     //refreshing table 
     games_table.setModel(gamesmodel); 

     //removing the selected item from JComboBox 
     selectedgames_combobox.removeItem(getchoice); 
+0

另請參見[禁用JList的項目](http://stackoverflow.com/a/8344497/1048330) – tenorsax 2013-02-13 16:58:44

+0

請參閱[如何禁用JComboBox中的某些項目](https://stackoverflow.com/questions/23722706/how-to-disable-certain-items-in-a-jcombobox)。 – 2017-11-16 12:38:23

回答

5

假設你有一個包含哪些應該被禁用某些元素的列表,你需要改變禁用元素的出現並且需要防止用戶選擇這些項目。爲了能夠阻止用戶選擇禁用那些你需要重寫的JComboBoxsetSelectedIndex方法是這樣的:

public void setSelectedIndex(int index) { 
    if (!disabled_items.contains(index)) { 
     super.setSelectedIndex(index); 
    } 
} 

您也可以更改項目的顏色BasicComboBoxRenderer這樣的:

if (disabled_items.contains(index)) { 
    setBackground(list.getBackground()); 
    setForeground(UIManager.getColor("Label.disabledForeground")); 
} 

For further details

+0

是的,我已經看到這個例子,但如何在運行時執行此操作。 – Akki 2013-02-13 11:37:54

+0

可以有另一個線程來控制運行時禁用請求,它應該從主線程中分離出來。用swing檢查簡單的2D動畫。 – 2013-02-13 11:58:32

+0

雖然答案是正確的,但[在StackOverflow上不鼓勵鏈接回答](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-答案)。該鏈接今天可能有效,但不能保證它會保持這種狀態。請複製最重要的部分_(不是完整的博客文章!)或用你自己的話來解釋它。謝謝。 – DarkDust 2014-02-19 18:16:55

0

這是我的溶液(可能是有用的)

/** 
* A ComboBox with Enabling/disabling items support 
*/ 
public class AvailableItemComboBox extends JComboBox { 
    private static final long serialVersionUID = 1L; 

    // previosly chosen item 
    protected int old = -1; 

    /** 
    * Default constructor 
    */ 
    public AvailableItemComboBox() { 
     super(); 
     setRenderer(new EnabledJComboBoxRenderer());  
     initializeComboBox(); 
    } 

    /** 
    * Constructor with model 
    * 
    * @param model 
    */ 
    public AvailableItemComboBox(ComboBoxModel model) { 
     super(model); 
     setRenderer(new EnabledJComboBoxRenderer()); 
     initializeComboBox(); 
     System.out.println("selected index is " + getSelectedIndex()); 
    } 

    /** 
    * Constructor with data 
    * 
    * @param model 
    */ 
    public AvailableItemComboBox(Available[] items) { 
     super(items); 
     setRenderer(new EnabledJComboBoxRenderer()); 
     initializeComboBox(); 
     System.out.println("selected index is " + getSelectedIndex()); 
    } 

    private void initializeComboBox() { 
     setSelectedIndex(findFirstAvailableItem()); 

     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) {  
       System.out.println("Listener called>>>>>>>>>>>>>>>>>>");     
       if (old != getSelectedIndex()) { 
        if (!((Available) getSelectedItem()).isEnabled()) { 
         setSelectedIndex(old); 
        } else { 
         old = getSelectedIndex(); 
        } 
       } 
      }  
     }); 
    } 

    // Finds first selecteditem and sets it as previous state 
    private int findFirstAvailableItem() { 
     int result = -1; 

     for (int index = 0; index < this.getItemCount(); index++) { 
      if (((Available)this.getItemAt(index)).isEnabled()) { 
       result = index; 
       break; 
      } 
     } 

     old = result; 
     return result; 
    } 
} 

public class EnabledJComboBoxRenderer extends BasicComboBoxRenderer { 
private static final long serialVersionUID = 1L; 

private Color disabledColor = Color.lightGray; 

/** 
* Constructs a new renderer for a JComboBox which enables/disables items 
* based upon the parameter model. 
* 
* @param enabled 
*/ 
public EnabledJComboBoxRenderer(){ 
    super();   
} 

/** 
* Sets the color to render disabled items. 
* 
* @param disabledColor 
*/ 
public void setDisabledColor(Color disabledColor){ 
    this.disabledColor = disabledColor; 
} 

/** 
* Custom implementation to color items as enabled or disabled. 
* 
* @inheritDoc 
*/ 
@Override 
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
    Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 

    boolean enabled = ((Available) value).isEnabled(); 

    if (!enabled) { 
     if (isSelected) { 
      c.setBackground(UIManager.getColor("ComboBox.background")); 
     } else { 
      c.setBackground(super.getBackground()); 
     } 
     c.setForeground(disabledColor); 
    } else { 
     c.setBackground(super.getBackground()); 
     c.setForeground(super.getForeground()); 
    } 

    return c; 
} 

}

public interface Available { 
public boolean isEnabled(); 
public void setEnabled(boolean enable); 

}