![](/img/trans.png)
[英]How do I make setters and getters for JList and DefaultListModel? (Java)
[英]How do I retrieve the Object type that I placed into a DefaultListModel?
我希望我能很好地解释我在这里追求的东西。 我在检索已放入 DefaultListModel 的对象类型时遇到问题。
public class HiddenIntegerFieldListItem {
private final String displayedField;
private final int hiddenField;
public HiddenIntegerFieldListItem( String dField, int hField ) {
displayedField = dField;
hiddenField = hField;
}
public String getDisplayedField() { return displayedField; }
public int getHiddenField() { return hiddenField; }
@Override
public String toString() { return displayedField; }
}
……别处……
DefaultListModel listModel = new DefaultListModel();
listModel.addElement( new HiddenIntegerFieldListItem( "The String", 4) );
jList.setModel( listModel );
这就是问题所在,当我去检索它时,它告诉我它无法将其转换为字符串。 但是我放入了一个对象......那么为什么它不把我的对象还给我呢? 编译器对一切都很好......直到我从模型中取出我的对象。 它给了我一个不兼容的类型警告,只有在我执行以下操作时才查找字符串......
HiddenIntegerFieldListItem hif =
(HiddenIntegerFieldListItem) jList.getModel().getElementAt( 0 );
我错过了什么? 为什么它只想给我一个字符串而不是我的对象? 它当然接受了对象,并且对象中有一个 toString() 方法。 而我得到的只是...
不兼容的类型:字符串不能转换为 HiddenIntegerFieldListItem
我难住了。 准备放弃将主键与项目描述一起存储在列表框中,而是编写一大堆意大利面条代码,这看起来很愚蠢。 :D 任何人都看到我在这里尝试做的事情并知道我做错了什么? 模型不能再存储对象了吗? 只有字符串?
通常,在编译时,当您从数据结构中提取项目时,它不会查看您放入时的类型(例如,它实际是什么),它要查找的是该方法的签名。
如果您的数据结构上的 get 方法的方法签名返回一个对象,那么就编译器而言,您从数据结构中提取的所有内容都是一个对象。
现在您知道实际的类是一个 HiddenIntegerFieldListItem - 所以您需要做的是告诉编译器它是什么,通过在使用它之前将其转换为该类型。
(如果你将它转换为错误的类型,编译器会让你 - 然后你会在运行时得到一个虚拟的吐痰。)
为了确保您不会将某些内容转换为错误的类型,您可以使用 instanceof 运算符。
另一件要注意的事情是,通过强制转换某些东西,您并没有改变它的本质,而是将其外观更改为其余代码。 所以Object的接口或定义有一定的方法,但HiddenIntegerFieldListItem的接口或定义有不同的方法,但所有的Object方法仍然可用。
所以这里的 Object 代表了某个最小的功能,然后当你投射它时,你说它有更多的功能,你可以合法地将它投射到它的超类层次结构中的任何东西。 但是你不能把它转换成它实际类的子类,因为那个子类可能有你的对象实际上没有的数据和方法。
好的,模拟工作。 问题是 netbeans 设计人员为我输入了 JList,用于字符串,而我不知道它会自动执行此操作。 一旦我从设计器工具的类型参数输入中删除它,一切都很好。 但这里是模型,对于任何想要在 JList 中的可见字符串旁边存储一个键的人。
public class Test {
class HiddenIntegerFieldListItem {
private final String displayedField;
private final int hiddenField;
public HiddenIntegerFieldListItem( String dField, int hField ) {
displayedField = dField;
hiddenField = hField;
}
public String getDisplayedField() { return displayedField; }
public int getHiddenField() { return hiddenField; }
@Override
public String toString() { return displayedField; }
}
public void tryIt() {
javax.swing.JList<HiddenIntegerFieldListItem> jList = new javax.swing.JList<>();
javax.swing.DefaultListModel listModel = new javax.swing.DefaultListModel();
listModel.addElement( new HiddenIntegerFieldListItem( "The String", 4) );
jList.setModel( listModel );
// all good up till there, then ... oh wait, it worked now! ???
HiddenIntegerFieldListItem hif = jList.getModel().getElementAt( 0 );
System.out.println( hif.getHiddenField() + "" ); //Yay! It works! Output: 4
}
public static void main (String args[] ) {
Test t = new Test();
t.tryIt();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.