JList的setSelectedValue方法的问题

时间:2011-07-13 16:42:22

标签: java jlist

当我运行应用程序的主类时遇到麻烦。事实是setSelectedValue方法不起作用。 主类的代码如下:

DatabaseConnection.getInstance().connect("org.sqlite.JDBC", "jdbc:sqlite:db/Universidad.sqlite");
DatabaseTableManagers managers = DatabaseTableManagers.getInstance();
DataBaseManagerJList.getInstance().setSelectedValue("Alumnos");
system.out.println(DataBaseManagerJList.getInstance().devolver() + "1");
    AlumnosTableManager atm = AlumnosTableManager.getInstance();
    System.out.println(DataBaseManagerJList.getInstance().devolver() + "2");
    CarrerasTableManager ctm = CarrerasTableManager.getInstance();
    System.out.println(DataBaseManagerJList.getInstance().devolver() + "3");
    managers.add(atm);
    System.out.println(DataBaseManagerJList.getInstance().devolver() + "4");
    managers.add(ctm);
    System.out.println(DataBaseManagerJList.getInstance().devolver() + "5");
    DataBaseManagerJFrame dbmf = new DataBaseManagerJFrame();
    System.out.println(DataBaseManagerJList.getInstance().devolver() + "6");
    dbmf.setVisible(true);


}

}

我在控制台中得到以下结果,告诉我该方法没有设置我放置的默认值: NULL1 NULL2 null3 null4 null5 null6

jlist类的代码如下:     公共类DataBaseManagerJList扩展了JPanel {

private static final long serialVersionUID = 1L;

private static JList tablas;

DefaultListModel model;
DatabaseTableManagers dtm = DatabaseTableManagers.getInstance();
private static DataBaseManagerJList instance = null;

public static DataBaseManagerJList getInstance()
{
    if (instance == null)
    {
        instance = new DataBaseManagerJList();
    }
    return instance;
}

public DataBaseManagerJList()
{
    model = new DefaultListModel();
    ArrayList<String> aux = new ArrayList<String>(dtm.getTableNames());
    for(int i =0;i<aux.size();i++)
    {
        model.addElement(aux.get(i));
    }
    tablas = new JList(model);  
    //tablas.setSelectedValue("Alumnos",true);
    add(tablas);
}

public String devolver()
{
    return (String) tablas.getSelectedValue(); 
}


public void setSelectedValue(String name)
{

    tablas.setSelectedValue(name, true);
}

}

1 个答案:

答案 0 :(得分:0)

您所描述的问题通常意味着在列表中找不到该对象。 setSelectedValue()方法可以调用object.equals()(在您的情况下为String.equals()),因此可能的原因是aux中包含的字符串以与您尝试的字符串不同的方式大写选择。

对于instace aux可能包含字符串“alumnos”而不是“Alumnos”。如果您不关心大小写(然后将字符串“Alumnos”更改为aux内的任何内容),如果您关心大写并且您仍然想要使用字符串,那么有两种选择simple创建一个MyString类,它扩展String并覆盖equals方法,如:

public class MyString extends String {
    @Override
    public boolean equals(Object obj){
        if (obj instanceof String){
            String obj2 = (String)obj;
            return this.equalsIgnoreCase(obj2);
        }
        return false;
    }
}

另一个替代方案(可能是更好的方法)是为列表创建一个包装器对象。

public class MyWrapper {
    private String payload;

    public MyWrapper(String payload){
        this.payload = payload;
    }

    @Override
    public String toString(){
        return payload;
    }

    @Override
    public boolean equals(Object obj){
        if (obj instanceof MyWrapper){
            MyWrapper obj2 = (MyWrapper)obj;
            return payload.equalsIgnoreCase(obj2.payload);
        }
        return false;
     }
}