ตั้งค่าและป้ายกำกับเป็น JComboBox

ฉันมี JComboBox โดยที่รายการเป็นผลลัพธ์ของการสืบค้น คำสั่งผสมจะแสดงชื่อหมวดหมู่ทั้งหมดที่นำมาจากแบบสอบถามใช่ไหม โอเค มันได้ผล ตอนนี้ฉันต้องระบุค่าให้กับแต่ละรายการ ซึ่งจะเป็นรหัสของผลิตภัณฑ์

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

    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]);
    }

ดังที่คุณเห็นในโค้ด "ป้ายกำกับ" ของแต่ละรายการคือชื่อของมัน ตอนนี้ ฉันจะตั้งค่าแต่ละรายการให้เป็น ID ได้อย่างไร เพื่อที่ฉันจะได้จัดการในภายหลังได้

ขอบคุณและพยายามตอบง่ายๆ ฉันกำลังมีเวลายากที่สุดในการพยายามได้สิ่ง Java นี้! ฮ่า!


person Agustín    schedule 02.08.2013    source แหล่งที่มา


คำตอบ (1)


JComboBox โดยค่าเริ่มต้นจะใช้ตัวเรนเดอร์ซึ่งใช้เมธอด toString() เพื่อแสดงข้อมูลออบเจ็กต์ ดังนั้นคุณจึงสามารถสร้างคลาสการเรนเดอร์ของคุณเองเพื่อปรับแต่งมุมมองได้

นี่คือวิธีที่มันถูกออกแบบมา

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;
        }
});

วิธีการแฮ็กอีกวิธีหนึ่งคือการแทนที่ toString() จาก Proveedor หรือสร้างคลาสอะแดปเตอร์ของคุณที่ใช้ toString() ของคุณ แต่โซลูชันนี้ไม่ยืดหยุ่นเท่าวิธีอื่น

public class Proveedor {

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

}

ในกล่องคำสั่งผสมหากคุณต้องการเติมข้อมูลจากศูนย์

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

หรือหากคุณมีข้อมูลเดิมและต้องการรักษาไว้

for(Proveedor p : dao.getAll){
    proveedorCombo.addItem(p);
}
person nachokk    schedule 02.08.2013
comment
-1 สำหรับการแทนที่ toString ด้วยเหตุผล มุมมอง วิธีที่จะไปคือตัวเรนเดอร์ที่กำหนดเอง - person kleopatra; 03.08.2013
comment
ใช่ คุณเข้าใจถูกแล้ว ... ฉันใช้วิธีการง่ายๆ ในการวางคลาสอะแดปเตอร์เป็นการเรนเดอร์ แต่ไม่เคยเป็นตัวอย่างที่ฉันจะแก้ไข - person nachokk; 03.08.2013
comment
ความพยายามที่ดี - แค่ไม่ดีพอเมื่อฉันต้องเผชิญหน้ากับแนวทางสกปรก ‹g› สองตัวเลือก หมายความว่าทั้งสองอย่างน่าจะอยู่ในระดับการแนะนำที่เท่ากันโดยประมาณ (หืม .. นั่นคือคำนั้นเหรอ? ขี้เกียจเกินกว่าจะถามลีโอ) - ซึ่งนี่ไม่ใช่กรณีอย่างแน่นอน โดยอันหนึ่งเป็นวิธีการออกแบบและอีกอันเป็นการแฮ็กที่รวดเร็วและสกปรกซึ่งเป็นทางตันในบริบทใด ๆ ยกเว้นบริบทที่ไม่สำคัญที่สุด - person kleopatra; 03.08.2013
comment
@kleopatra สบายดีไหม? โปรดอ่านความคิดเห็น camick นี้ เนื่องจากฉันเข้าใจว่าเขาไม่เห็นด้วยกับการใช้ toString() เท่าที่ฉันเข้าใจความคิดเห็นนั้น คุณคิดอย่างไร ? - person nachokk; 12.11.2013