java - 将一个 JList 中的字符串移动到另一个 JList 时出现错误

标签 java swing classcastexception

我的代码中有一个异常:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
    at darren.choose$1.actionPerformed(choose.java:30)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

像这样的代码,请帮助我:

public class choose extends JFrame {

    JList<String> jl1;
    JList<String> jl2;
    JButton jb1;
    private static String[] food = {"bacon", "apple", "dumpline", "egg", "rice"};

    public choose() {
        super("JFrame title");
        setLayout(new FlowLayout());

        jl1 = new JList<String>(food);
        jl1.setVisibleRowCount(3);
        jl1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        add(new JScrollPane(jl1));

        jb1 = new JButton("move to -->");
        jb1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                jl2.setListData((String[]) jl1.getSelectedValues());
            }
        });
        add(jb1);

        jl2 = new JList<String>();
        jl2.setVisibleRowCount(3);
        jl2.setFixedCellHeight(15);
        jl2.setFixedCellWidth(100);
        jl2.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        add(new JScrollPane(jl2));
    }
}

最佳答案

第一:public Object[] JList.getSelectedValues()自 Java 1.7 起已弃用。
在其实际实现中,它返回一个对象数组实例:

@Deprecated
public Object[] getSelectedValues() {
    ListSelectionModel sm = getSelectionModel();
    ListModel<E> dm = getModel();

    int iMin = sm.getMinSelectionIndex();
    int iMax = sm.getMaxSelectionIndex();

    if ((iMin < 0) || (iMax < 0)) {
        return new Object[0];
    }

    Object[] rvTmp = new Object[1+ (iMax - iMin)];
    int n = 0;
    for(int i = iMin; i <= iMax; i++) {
        if (sm.isSelectedIndex(i)) {
            rvTmp[n++] = dm.getElementAt(i);
        }
    }
    Object[] rv = new Object[n];
    System.arraycopy(rvTmp, 0, rv, 0, n);
    return rv;
}

所以这沮丧成String[]只能失败:

 jl2.setListData((String[]) jl1.getSelectedValues());

相反,您应该使用 List<E> JList.getSelectedValuesList()返回 List<E>哪里EJList 中指定的通用名称变量声明。

所以你可以这样做:

JList<String> jl1 = new JList<>() ;
JList<String> jl2 = new JList<>() ;
...
List<String> jl1Values = jl1.getSelectedValuesList();
jl2.setListData(jl1Values.toArray(new String[jl1Values.size()]));

关于java - 将一个 JList 中的字符串移动到另一个 JList 时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239978/

相关文章:

java - 在另一个 xsd 中引用另一个 xsd 元素?

java - 面板中的背景颜色不会改变

java - Soot:soot.jimple.JimpleBody 无法转换为 soot.dava.DavaBody

java - 使用并解析 request.getParameter 中的 Double ("price");

Java - 无法编辑字节数组内容?

java - 编写一个接受对象作为参数的方法,并使用它的方法来做某事(java)

java - 将 getter 合并到静态方法中时遇到问题

java - JFrame 未出现

java - 在 JScrollPane 上设置滚动条

hadoop MultipleInputs 因 ClassCastException 而失败