2013-09-30 72 views
0

Hello我有以下代碼來查看JComboBox中的項是否是類(Persoon)的實例。對象的JComboBox實例中的項目

public class ItemChangeListener implements ItemListener { 

     Persoon selectedPerson; 
     RekeningApp app; 
     PersoonView view; 

     public ItemChangeListener(PersoonView view) { 

      this.view = view; 

     } 

     public void itemStateChanged(ItemEvent event) { 
      if (event.getStateChange() == ItemEvent.SELECTED) { 
       Object item = event.getItem(); 
       System.out.println("Itemchangelistener " + item); 
       // do something with object 
       if(item instanceof Persoon) { 
        System.out.println("Instance"); 
        this.selectedPerson = (Persoon) item; 
        view.setOverzicht(this.selectedPerson); 
       } else { 
        this.selectedPerson = null; 
       } 
      } 
     } 

    } 

item的輸出是persoon.name變量的值。所以JComboBox中的項目實際上是字符串。

這是如何設置JComboBox列表。

personenList.addItem(persoon.getNaam());

我的問題是..我怎麼能檢查如果這Persoon對象excists,是一樣的,在JComboBox中?

+0

什麼是目標,因爲那裏(沒有問,描述,不是在這裏發佈的代碼只是猜測)是兩個三個差異和最簡單的方法,沒有人知道沒有SSCCE(更好和說成千上萬的工作)或關於 – mKorbel

+0

默認情況下,Swing默認返回toString或Object(用Java實現的所有可能的數據類型) – mKorbel

回答

7

您應該添加到JComboBoxPerson對象,不只是名字,所以當你調用Object item = event.getItem();這將返回Person,不是String。如果你想在JComboBox顯示這個人的名字,在Person類重寫toString方法是這樣的:

public String toString() 
    return this.naam; 
} 

而且你應該添加項目到列表中。

personenList.addItem(persoon); 

編輯

如果你不想(或可以)覆蓋toString方法,你應該使用自定義渲染器。這是和示例的鏈接:

http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer

+0

Mate you rock!這正是我想要的:D – Reshad

+0

感嘆...重寫toString不是正確的方法。相反,實現一個自定義渲染器,使用該屬性來設置其文本 – kleopatra

+0

@kleopatra你是對的,我只是想使用默認渲染器(調用'toString'和object)來簡化事情。不過,我更新了我的答案。 – omainegra

4

覆蓋toString只是用於顯示目的的方法是不是一個好的做法。 這也是一個潛在的瓶頸。比方說,你需要顯示兩個不同的人JComboBox:在其中一個你需要只顯示名稱,在另一個你需要顯示全名。您只能一次覆蓋Person#toString()方法。

通過的方法是使用ListCellRenderer。例如:

public class Person { 
    private String _name; 
    private String _surname; 

    public Person(String name, String surname){ 
     _name = name; 
     _surname = surname; 
    } 

    public String getName() { 
     return _name; 
    } 

    public String getSurname() { 
     return _surname; 
    }  
} 

這裏是GUI:

import java.awt.Component; 
import java.awt.GridLayout; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Demo { 

    private void initGUI(){ 
     Person person1 = new Person("First", "Person"); 
     Person person2 = new Person("Second", "Person"); 
     Person[] persons = new Person[]{person1, person2}; 

     /* 
     * This combo box will show only the person's name 
     */ 
     JComboBox comboBox1 = new JComboBox(new DefaultComboBoxModel(persons)); 
     comboBox1.setRenderer(new DefaultListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
       super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
       if(value instanceof Person){ 
        Person person = (Person) value; 
        setText(person.getName()); 
       } 
       return this; 
      } 
     }); 

     /* 
     * This combo box will show person's full name 
     */ 
     JComboBox comboBox2 = new JComboBox(new DefaultComboBoxModel(persons)); 
     comboBox2.setRenderer(new DefaultListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
       super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
       if(value instanceof Person){ 
        Person person = (Person) value; 
        StringBuilder sb = new StringBuilder(); 
        sb.append(person.getSurname()).append(", ").append(person.getName()); 
        setText(sb.toString()); 
       } 
       return this; 
      } 
     }); 

     JPanel content = new JPanel(new GridLayout(2, 2)); 
     content.add(new JLabel("Name:")); 
     content.add(comboBox1); 
     content.add(new JLabel("Surname, Name:")); 
     content.add(comboBox2); 

     JFrame frame = new JFrame("Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(content); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

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

      @Override 
      public void run() { 
       new Demo().initGUI(); 
      } 
     }); 

    } 
} 

如果運行這個例子,你會看到這樣的內容:

enter image description here

正如你可以看到這兩個JComboBox包含Person對象,但它們的表示形式在每個對象中都不相同。