使用Arraylist填充JCombobox

时间:2014-08-10 02:58:13

标签: java eclipse swing arraylist jcombobox

我似乎无法让ArrayList进入组合框。组合框应该显示可用的房间号码。

目前,当它编译时,组合框显示出我认为是某种异常。组合框显示行“HotelReservation.entity.Rooms@24084dad,HotelReservation.entity.Rooms @ 716ab511..etc”

我正在为我的应用程序实现3层架构。我在这里做错了什么?

实体 - Rooms.java

public ArrayList<Rooms> getRoomNums() {
    // TODO Auto-generated method stub
    ArrayList<Rooms> rNumList = new ArrayList<Rooms>();
    DBController db = new DBController();
    String dbQuery="SELECT DISTINCT roomNo FROM Rooms "
            + "WHERE hotelNo='" + CheckAvailability.hotNo + "' AND type='" + AgentDetails.typeDin + "' AND roomNo NOT IN (SELECT roomNo FROM booking WHERE departureDate >= '" 
            + CheckAvailability.depDate + "' AND arrivalDate <= '" + CheckAvailability.arrDate + "');";
    try{
        db.getConnection();
        ResultSet rs = db.readRequest(dbQuery);
        while(rs.next())
        {
            Rooms r = new Rooms(rs.getString("roomNo"));
            rNumList.add(r);
        }
     }

    catch(Exception e){
        e.printStackTrace();
    }
    db.terminate();
    return rNumList;
}

Controller类 - AdmininistrateController.java

public ArrayList processGetRoomNum() {
    // TODO Auto-generated method stub
    Rooms s = new Rooms();
    ArrayList<Rooms> rNumList = new ArrayList<Rooms>();
    rNumList = s.getRoomNums();
    return rNumList;

}

UI - GuestDetails.java

comboBox1 = new JComboBox();
comboBox1.setFont(new Font("Tahoma", Font.PLAIN, 15));
comboBox1.setBounds(61, 9, 411, 25);
ucc = new AdministrateController();
ArrayList<Rooms>rNumList = new ArrayList<Rooms>();
rNumList = ucc.processGetRoomNum();
displayRoomNo(rNumList);


private void displayRoomNo(ArrayList<Rooms> rNumList) {
    // TODO Auto-generated method stub

    //I have tried two different ways but still didn't work
    //#1 For loop
    for (int i = 0; i < rNumList.size(); i++){

            comboBox1.addItem(rNumList.get(i));
     }

    //#2Convert to array & set model
    DefaultComboBoxModel model = new DefaultComboBoxModel(rNumList.toArray(new 
    Rooms[rNumList.size()]));
    comboBox1.setModel(model);

1 个答案:

答案 0 :(得分:1)

  

HotelReservation.entity.Rooms@24084dad

您所看到的是Rooms对象的内存位置。您可以简单地覆盖toString()类的Rooms,并将其表示形式(即只是房间号)表示为字符串。

您可能想要考虑的另一件事是,如果您只想要roomNo的列表,可以使用组合框的房间号。即comboBox1.addItem(rNumList.get(i).getRoomNo());而不是comboBox1.addItem(rNumList.get(i));这样您就不必覆盖toString()类的Rooms,以防您希望字符串表示超过Rooms只是房间号码(也许是其他的东西)。但问题是,当您选择房间号时,您不会选择Rooms对象,而只选择房间号。您将不得不进行一些额外的查询(使用房间号)来使用该房间数据库域对象。所以这真的取决于你应该采用哪种方式的全部要求。

  

组合框显示行......

您的查询仅返回房间号列表,而不是整行。我还注意到您没有使用ORM实体,您只是为从qeusry获得的每个房间号创建默认{{1}},因此房间对象不具有每个房间的特定数据库数据。所以你可能只想使用第二种方法。但话说回来,如果你这样做,我认为创建一个房间列表毫无意义。而只是从结果集中创建列表或房间号。