2017-05-16 7 views
0

6 개의 요소가있는 동일한 DefaultListModel을 사용하여 6 개의 콤보 상자가 있습니다. 콤보 상자 중 하나가 목록에서 다른 콤보 상자가 선택한 요소를 선택하면 요소를 선택한 사람을 바꿀 수 있도록 ActionListener를 사용합니다. 일명, 콤보 박스 1은 선택된 요소 1을 가지고, 콤보 박스 3이 선택한 요소 2를 선택하고, 청자가 콤보 박스 3을 실행 한 후에 요소 1을 선택하게합니다.여러 개의 동일한 요소가 항상있는 JComboBox

ActionListener abilCBListener = new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent evt){ 
     JComboBox cb = (JComboBox)evt.getSource(); 
     int ind = abilCBArray.indexOf(cb); 
     int num = 15; 
     int dup = 7; 

     if(abilCBArray.size() == 6 && abilCBBoo == true){ 
      abilCBBoo = false;// prevents another combobox's listener from firing 
      for(int i = 0; i < abilCBArray.size();i++){ 
       //System.out.println("i = " + i + " index = "+abilCBArray.get(i).getSelectedIndex()); 
       if(i != ind){ 
        num -= abilCBArray.get(i).getSelectedIndex(); 
        System.out.println("i = "+ i+" num = "+ num+ " Index = "+abilCBArray.get(i).getSelectedIndex()); 
        if(abilCBArray.get(i).getSelectedIndex() == cb.getSelectedIndex()){ 
         dup = i; 
        } 
       } 
      } 
      if(num < abilCBArray.size() && dup != 7){ 
       abilCBArray.get(dup).setSelectedIndex(num); 
      } 
     }else{ 
      System.out.println("Tried to run abilCBArrayChange without full array");    
     }   
     abilCBBoo = true; 
    } 
}; 

문제는 사용자가 DefaultListModel에 숫자의 임의의 집합을 넣을 수 있고, 숫자를가 동일한 경우 콤보 내 ActionListener를 망쳐 놨어요 수의 첫 번째 인스턴스의 인덱스를 선택할 것입니다 . 내가 읽는 모든 것은 콤보 상자 선택 문제를 해결하기 위해 목록의 각 항목을 고유하게 만들어야한다는 것을 나타내는 것으로 보이며 여전히 getSelectIndex()를 사용할 수 없습니다. 왜냐하면 이렇게해도 첫 번째 인스턴스를 반환하기 때문입니다 번호의.

+1

'getSelectedIndex()는'당신에게 – XtremeBaumer

답변

1

메소드 getSelectedItem()을 호출 할 수 있습니다. 선택한 값이 반환됩니다.

JComboBox에는 기본 ComboBoxModel이 있습니다. 선언시에 그것의 타입을 설정할 수 있습니다.

JComboBox<String> j = new JComboBox(); 

그래서이 comboBox는 String을 모델로 사용합니다. 선택한 항목을 가져 오려면 다음을 호출하십시오.

j.getSelectedItem() 

그러면 선택한 문자열이 표시됩니다. 당신이

j.getSelectedIndex() 

를 호출하는 경우에는 모델에서 선택한 문자열의 인덱스를 얻을 것이다 당신이 선택한 값을 얻기 위해, 다시 매핑해야합니다. 따라서 getSelectedItem()이 올바른 방법입니다.

+0

지금 더 먹으 렴 선택한 요소의 인덱스를 제공해야합니다 ;-) 지금 우리는 청소 우리 주석 및 모든 괜찮습니다 ;-) – GhostCat

1

6 개의 요소가있는 동일한 DefaultListModel을 사용하여 6 개의 콤보 박스가 있습니다.

콤보 상자가 동일한 모델을 공유하는 경우 하나의 콤보 상자에서 선택하면 모든 콤보 상자가 동일한 선택 항목으로 업데이트됩니다.

동일한 데이터를 포함하는 각 모델로 6 개의 다른 DefaultListModel을 만들어야합니다.

의 콤보는 수의 첫 번째 인스턴스의 인덱스를 선택합니다

문제는 "선택 항목"콤보 박스 모델의 선택 항목이 아닌 인덱스를 저장한다는 것입니다 .

getSelectedIndex() 메소드를 호출하면 선택한 객체와 동일한 객체를 찾을 때까지 모델의 모든 항목을 반복합니다.

모델에 추가 된 개체가 equals 메서드를 구현하면이 개체가 항상 첫 번째 개체가됩니다.

그래서 해결책은 모델에 저장할 사용자 지정 개체를 만드는 것입니다.

@mKorbel이 제공하는 답변을 참조하십시오.원시적 배열에 따라

+0

AFAIK 원시 배열을 기반으로합니다 그렇지 않으면 올바르게 작동하지, 버그 또는 Java6에서 기능, – mKorbel

+0

내 코드 설명을 참조하십시오 여기에 답변을 게시하십시오 – mKorbel

+0

여기 방법은 내가 t 그는 단지 1 세트의 데이터로 동일한 항목을 선택하는 콤보 상자 [링크] (http://stackoverflow.com/questions/18171992/populate-multiple-combobox-with-same-model-but-select-diff) – Richard

3

import java.awt.event.ActionEvent; 
import javax.swing.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.util.Vector; 

public class TestDuplicatesItems { 

    private Vector<String> vec = new Vector<String>(); 
    private String[] degrees = {"AAS1", "AAS2", "AAS1", "AAS1"}; 
    private JComboBox combo = new JComboBox(vec); 
    private JComboBox combo1 = new JComboBox(degrees); 
    private JTextField txt = new JTextField(10); 
    private JFrame frame = new JFrame("JComboBox with Duplicates Items"); 
    private JPanel panel = new JPanel(); 

    public TestDuplicatesItems() { 
     vec.add("AAS1"); 
     vec.add("AAS1"); 
     vec.add("AAS1"); 
     vec.add("AAS1"); 
     //combo.setEditable(true); 
     //combo.setBackground(Color.gray); 
     //combo.setForeground(Color.red);   
     //combo.setEditable(true); 
     //combo1.setBackground(Color.gray); 
     //combo1.setForeground(Color.red);   
     txt.setText("1"); 
     combo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(combo.getSelectedIndex()); 
       System.out.println(combo.getSelectedItem().toString()); 
       txt.setText(String.valueOf(combo.getSelectedIndex())); 
      } 
     }); 
     combo1.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if ((e.getStateChange() == ItemEvent.SELECTED)) { 
        System.out.println(combo1.getSelectedIndex()); 
        System.out.println(combo1.getSelectedItem().toString()); 
        txt.setText(String.valueOf(combo1.getSelectedIndex())); 
       } 
      } 
     }); 
     panel.add(combo); 
     panel.add(combo1); 
     panel.add(txt); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestDuplicatesItems tdi = new TestDuplicatesItems(); 
      } 
     }); 
    } 
} 

@camickr

import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

public class SelectedComboBoxID { 

    private JComboBox combo = new JComboBox(); 
    private JFrame frame = new JFrame("MyComboEg"); 
    private JTextField txt = new JTextField(10); 
    private JPanel panel = new JPanel(); 

    public SelectedComboBoxID() { 
     combo.addItem(new Item(1, "-")); 
     combo.addItem(new Item(2, "Snowboarding")); 
     combo.addItem(new Item(3, "Rowing")); 
     combo.addItem(new Item(4, "Knitting")); 
     combo.addItem(new Item(5, "Speed reading")); 
     combo.addItem(new Item(6, "Pool")); 
     combo.addItem(new Item(7, "None of the above")); 
     //comboBox.setMaximumRowCount(3); 
     combo.setPrototypeDisplayValue(" None of the above "); 
     combo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JComboBox comboBox = (JComboBox) e.getSource(); 
       Item item = (Item) comboBox.getSelectedItem(); 
       System.out.println(item.getId() + " : " + item.getDescription()); 
       txt.setText(String.valueOf(combo.getSelectedIndex())); 
      } 
     }); 
     //comboBox.setRenderer(new ItemRenderer()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     panel.add(combo); 
     panel.add(txt); 
     frame.add(panel); 
     frame.pack(); 
     //frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private class ItemRenderer extends BasicComboBoxRenderer { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (value != null) { 
       Item item = (Item) value; 
       setText(item.getDescription().toUpperCase()); 
      } 
      if (index == -1) { 
       Item item = (Item) value; 
       setText("" + item.getId()); 
      } 
      return this; 
     } 
    } 

    private class Item { 

     private int id; 
     private String description; 

     public Item(int id, String description) { 
      this.id = id; 
      this.description = description; 
     } 

     public int getId() { 
      return id; 
     } 

     public String getDescription() { 
      return description; 
     } 

     @Override 
     public String toString() { 
      return description; 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SelectedComboBoxID selectedComboBoxID = new SelectedComboBoxID(); 
      } 
     }); 
    } 
} 
+0

(1+) 예,이 솔루션은 콤보 상자 모델에 저장할 사용자 지정 개체를 만드는 것입니다. (나는 당신이 "primitive array"로 무엇을 의미하는지 확신 할 수 없었다). – camickr

+0

POJO는 나를위한 프리미티브 배열, toString()을 반환하는 Object of Object, 아마도 내 (하나) missinterpretation (s) – mKorbel

+0

고맙습니다. – Richard