2012-03-10 2 views
4

JComboBox의 실제 내용과 다른 값을 정의 할 수 있습니까?JComboBox의 값

<select> 
    <option value="value1">Content1</option> 
    <option value="value2">Content2</option> 
    <option value="value3">Content3</option> 
</select> 

를 여기에 상관없이 그 내용이 얼마나 길고 짧은 값을 얻을 수 없습니다 다음과 같이 HTML에서
가 보인다.

자바에서 나는 단지 다음과 같은 솔루션 알고

// Creating new JComboBox with predefined values 
    String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; 
    private JComboBox combo = new JComboBox(petStrings); 

// Retrieving selected value 
    System.out.println(combo.getSelectedItem()); 

을 그러나 여기 난 단지 등

문제는 내가 모든 이름을로드 할 것이있다 "고양이", "개"를 얻을 것 고객을 데이터베이스에서 JComboBox로 가져온 다음 선택한 고객으로부터 ID를 검색합니다. 그것은 다음과 같아야합니다

<select> 
    <option value="104">Peter Smith</option> 
    <option value="121">Jake Moore</option> 
    <option value="143">Adam Leonard</option> 
</select> 
+0

답은 CombBoxModel입니다. 구현 된 Vector로 시작하는 모든 것을 Xml 구조체로 끝낼 수 있습니다. – mKorbel

답변

6

고객 클래스를 만들고 고객 개체 목록을 콤보 상자에로드하면 원하는 것을 얻을 수 있습니다. 콤보 상자는 객체의 toString()을 표시하므로 Customer 클래스는 toString()에서 이름을 반환해야합니다. 선택한 항목을 검색 할 때 ID 또는 다른 항목을 얻을 수있는 Customer 개체를 가져옵니다.


다음은 내가 제안하는 것을 보여주는 예입니다. 그러나이 기본 아이디어가 작동 할 때 kleopatra와 mKorbel의 조언을 따르는 것이 좋습니다.

import java.awt.BorderLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ComboJumbo extends JFrame{ 

    JLabel label; 
    JComboBox combo; 

    public static void main(String args[]){ 
     new ComboJumbo(); 
    } 

    public ComboJumbo(){ 
     super("Combo Jumbo"); 
     label = new JLabel("Select a Customer"); 
     add(label, BorderLayout.NORTH); 

     Customer customers[] = new Customer[6]; 
     customers[0] = new Customer("Frank", 1); 
     customers[1] = new Customer("Sue", 6); 
     customers[2] = new Customer("Joe", 2); 
     customers[3] = new Customer("Fenton", 3); 
     customers[4] = new Customer("Bess", 4); 
     customers[5] = new Customer("Nancy", 5); 

     combo = new JComboBox(customers); 
     combo.addItemListener(new ItemListener(){ 

      public void itemStateChanged(ItemEvent e) { 
       Customer c = (Customer)e.getItem(); 
       label.setText("You selected customer id: " + c.getId()); 
      } 

     }); 
     JPanel panel = new JPanel(); 
     panel.add(combo); 
     add(panel,BorderLayout.CENTER); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400, 200); 
     setVisible(true); 
    } 


    class Customer{ 
     private String name; 
     private int id; 

     public Customer(String name, int id){ 
      this.name = name; 
      this.id = id; 
     } 

     public String toString(){ 
      return getName(); 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 
    } 
} 
+0

-1 뷰의 이유로 toString을 재정의하는 것이 좋습니다. 올바른 할 일은 커스텀 렌더러입니다. – kleopatra

+0

'combo.addItem (customer.get (i) .toString());','Customer @ 749395a','Customer @ 2864932e' 등의 항목으로 가득 찬 목록을받습니다. –

+1

@Evgeni Reznik 먼저 고객 클래스에 toString() 메서드를 작성해야합니다. 고객이 수업을 들으십니까? 사용자 정의 toString()은 콤보 상자에 표시 할 고객의 적절한 이름을 반환합니다. 그런 다음 전체 고객 오브젝트를 콤보 박스에 추가 할 수 있습니다. –

3

당신은 이름과 ID를 보유하고 Person 클래스를 가정하면, 콤보 상자의 객체로이 클래스의 인스턴스를 추가 할 수 있습니다. getSelectedItem()은 선택한 Person의 인스턴스를 반환합니다.

문제는 사람을 콤보 상자에 올바르게 표시하는 것입니다. 클래스의 toString을 오버로드하여 이름을 반환하거나 콤보 상자에 자신의 ListCellRenderer을 제공하고 콤보 상자에 원하는대로 (예 : 사진 축소판 그림) 렌더링 할 수 있습니다.

+0

렌더러에 +1, toString을 오버라이드하기 위해 -1 (총 0 개) : – kleopatra

0

난 그냥 다른 레이블 값 클래스에 toString()을 대체하는 사용자 정의 ListCellRenderer을 만들 수있는 좋은 방법을 설명 https://stackoverflow.com/a/10734784/11961에 또 다른 질문을 대답했다.

관련 문제