Tetapkan Nilai dan Label ke JComboBox

Saya memiliki JComboBox yang itemnya adalah hasil kueri. Kombo tersebut menunjukkan semua nama kategori yang diambil dari kueri, bukan? Oke, itu berhasil. Sekarang saya perlu memberi nilai pada setiap item, yang akan menjadi ID produk.

Inilah yang saya dapatkan sejauh ini:

    final JComboBox proveedorCombo = new JComboBox();

    contentPanel.add(proveedorCombo);

    ProveedorDAO dao = new ProveedorDAO();

    List<Proveedor> proveedor = dao.getAll();

    Object[][] elementos = new Object[proveedor.size()][2];

    for (int i = 0; i < proveedor.size(); i++) {
        Proveedor p = proveedor.get(i);
        elementos[i][0] = p.getId();
        elementos[i][1] = p.getNombre();
        proveedorCombo.addItem(elementos[i][1]);
    }

Seperti yang Anda lihat di kode, "label" setiap item adalah namanya. Sekarang, bagaimana cara mengatur ID setiap item sehingga saya dapat memanipulasinya setelahnya?

Terima kasih dan coba jawab dengan mudah, saya paling kesulitan mencoba mendapatkan barang Java ini! Ha!


person Agustín    schedule 02.08.2013    source sumber


Jawaban (1)


JComboBox secara default menggunakan renderer yang menggunakan metode toString() untuk menampilkan data objek. Jadi, Anda bisa membuat kelas render sendiri untuk menyesuaikan tampilan.

Ini adalah cara yang dirancang untuk itu.

proveedorCombo.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 != null){
                 Proveedor proveedor = (Proveedor)value;
                 setText( proveedor.getName());
                }
            return this;
        }
});

Pendekatan hacky lainnya adalah mengganti toString() dari Proveedor atau membuat kelas adaptor Anda yang menggunakan toString() Anda tetapi solusi ini tidak sefleksibel yang lain.

public class Proveedor {

//in some part
@Override
public String toString(){
    return this.nombre;
}

}

Pada combobox jika ingin mengisi dari nol.

proveedorCombo.setModel(new DefaultComboBox(new Vector<Proveedor>(dao.getAll())));

Atau jika Anda memiliki data sebelumnya dan ingin mempertahankannya.

for(Proveedor p : dao.getAll){
    proveedorCombo.addItem(p);
}
person nachokk    schedule 02.08.2013
comment
-1 untuk mengganti toString karena alasan view, cara yang harus dilakukan adalah perender khusus - person kleopatra; 03.08.2013
comment
Ya, Anda benar ... saya mengambil cara mudah dengan menempatkan kelas adaptor sebagai render tetapi tidak pernah ada contoh yang akan saya edit - person nachokk; 03.08.2013
comment
usaha yang bagus - hanya saja tidak cukup baik ketika saya sedang dalam misi melawan pendekatan kotor ‹g› Dua opsi berarti keduanya kira-kira berada pada tingkat rekomendasi yang sama (huch.. apakah itu sebuah kata? , terlalu malas untuk bertanya pada Leo) - yang pastinya tidak demikian, salah satunya adalah cara desainnya dan yang lainnya merupakan peretasan cepat & kotor yang merupakan jalan buntu dalam konteks apa pun kecuali konteks yang paling sepele - person kleopatra; 03.08.2013
comment
@kleopatra apa kabar? Silakan baca komentar camick ini, seperti yang saya pahami dia tidak setuju menggunakan toString() sejauh saya memahami komentar itu, bagaimana menurut Anda ? - person nachokk; 12.11.2013