2012-03-10 11 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()); 

しかし、ここで私だけなど、「猫」、「犬」、

問題は、私はすべての名前をロードすること、であるになるだろう:私は、次の解決策を知っているJavaでは

顧客をデータベースからJComboBoxに追加し、選択した顧客からIDを取得します。それは次のようになります。

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

答えが使用されています。実装されたVectorで始まるものすべてがXml構造体で終わることができます。 – mKorbel

答えて

6

Customerクラスを作成し、Customerオブジェクトのリストをコンボボックスにロードすると、必要なものが得られます。コンボボックスにはオブジェクトの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で別の質問に答えました。