从JList检索自定义对象

时间:2019-11-28 13:13:50

标签: java swing jlist

我创建了一个列表和一个带有自定义对象的模型。我想检索列表中的对象,但是,我收到一条错误消息,提示无法将String转换为Object。

String cannot be converted to ARMAJTermek

Swing自动创建JList,然后向其中添加一个新模型。

DefaultListModel model = new DefaultListModel<ARMAJTermek>();
TermekList.setModel(model);

我需要这个,因为我正在使用一个自定义对象,该对象具有属性和方法,稍后需要调用它们。为此,我覆盖了.toString方法,如下所示:

@Override
    public String toString () {
        String toString = "";
        toString = this.nev+"\n"+this.cikkszam+"\n"+Integer.toString(this.bruttoKisker)+" Ft";
        return toString;
    }

这样,当我将一个对象添加到JList时,该对象将按照单元格渲染器的设计显示(这也是唯一的,将JTextArea显示为列表元素...)。

for (int i... and lots of other code) {
    model.addElement(termek[i]);
}
TermekList.setModel(model);
TermekList.revalidate();
TermekList.repaint();

在将对象添加到列表后,它会正确显示,并且可以正确运行,就像我在列表中选择一个对象时,它的方法可以正确运行。但是,当我尝试为其他JList复制所选对象时,无法检索它们。我尝试使用

从列表本身中获取它
ARMAJTermek termek = (ARMAJTermek)TermekList.getSelectedValue();
ARMAJTermek termek = (ARMAJTermek)TermekList.getModel().getElementAt(TermekList.getSelectedIndex());

(不同的函数,这就是为什么某些变量甚至是不同类型都具有相同名称的原因。)

但是我得到消息,这些字符串无法转换为ARMAJTermek。但是我不需要对象的String表示,我需要对象本身。我的意思是,如果可以通过单击列表中的字符串表示形式来运行该方法,那么我应该能够复制它们,对吧?

public class ARMAJTermek {
    String nev;
    String cikkszam;
    int bruttoKisker;

    public ARMAJTermek(String nev, String cikkszam, int bruttoKisker) {
        this.nev = nev;
        this.cikkszam = cikkszam;
        this.bruttoKisker = bruttoKisker;
    }

    @Override
    public String toString () {
        String toString = "";
        toString = this.nev+"\n"+this.cikkszam+"\n"+Integer.toString(this.bruttoKisker)+" Ft";
        return toString;
    }
}

public ui_main() throws  {
    initComponents();
    DefaultListModel model = new DefaultListModel<ARMAJTermek>();
    TermekList.setModel(model);

    ARMAJTermek termek[2];
    termek[0] = new ARMAJTermek("lorem", "ipsum", 1);
    termek[1] = new ARMAJTermek("lorem2", "ipsum2", 2);
}

public void addTermek(JList TermekList) {
    DefaultListModel model = new DefaultListModel<ARMAJTermek>();
    model.clear();
    if(TermekList.getSelectedIndex() == 0){
            TermekList.setSelectedIndex(1);
        }
    TermekList.removeAll();
    for ( int i = 0; i < termek.length; i++ ) {
        model.addElement(termek[i]);
    }
    TermekList.setModel(model);
        TermekList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        TermekList.revalidate();
        TermekList.repaint();
}

public void getTermek(JList TermekList) {
    ARMAJTermek termek = (ARMAJTermek)TermekList.getSelectedValue();
    ARMAJTermek termek = (ARMAJTermek)TermekList.getModel().getElementAt(TermekList.getSelectedIndex());
}

1 个答案:

答案 0 :(得分:0)

我通过在函数内部创建一个新函数来运行它,该函数可以获取并存储ARMAJTermek对象:

ARMAJTermek termek = ARMAStaticFunctions.getTermek(TermekList);

public static ARMAJTermek getTermek(JList TermekList) {
        ARMAJTermek termek = (ARMAJTermek)TermekList.getSelectedValue();
        return termek;
}

现在它可以按预期工作,而不是尝试将对象转换为String。