我创建了一个扩展JFrame的类,默认情况下会使用它创建一个JPanel。我试过这个:
public class Main extends JFrame {
JPanel pane;
private static final long serialVersionUID = 1L;
public Main() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int WIDTH = 500, HEIGHT = 500;
setBackground(Color.LIGHT_GRAY);
setSize(WIDTH, HEIGHT);
setTitle("Window");
setLocationRelativeTo(null);
pane = getContentPane();
}
我正在使用Eclipse,并且它给出了一个错误,建议我投射getContentPane()
以返回JPanel
,但根据我的理解,这应该是它应该返回的内容。我插入System.out.println(getContentPane());
并在控制台中说它返回JPanel
,所以我有点困惑为什么需要进行投射。这里有什么我想念的吗?感谢。
答案 0 :(得分:6)
Container
是JPanel
的继承层次结构中的父级
getContentPane()
会返回Container
,在这种情况下,它是JPanel
个对象。因此,需要强制转换才能将Container
强制转换为更具体的子类型,如下所示:
pane = (JPanel) getContentPane();
答案 1 :(得分:4)
如果您阅读了JavaDocs for JFrame#getContentPane
,则会看到它返回Container
的实例,然后才能将其分配给JPanel
变量,您必须将其投射
在很多情况下,您真的应该在JPanel
语句中使用instanceof
测试返回结果是否实际上是if
的实例(或可赋予)
答案 2 :(得分:3)
它发出错误,建议我投射getContentPane()来返回JPanel,但根据我的理解,这应该是它应该返回的
您收到错误是因为您致电:
getContentPane();
来自返回类型为Container
的JFrame,并且您尝试将Container
分配到JPanel
:
JPanel pane;
pane = getContentPane();
如果你不明白为什么不允许上述内容,请考虑一下。
由于所有狗都是动物,因此就代码而言,您可以随时执行此操作:
Animal animal = new Dog(); //Assign dog as Animal (O.K)
但是,如果我有一个动物。我可以说这绝对是一只狗吗?
Dog dog= new Animal(); //Assign animal as dog (NOT O.K)
答案是否定的,除非你明确地告诉我 "相信我,这只动物是一只狗。让我将这个Dog对象分配给Dog变量。"。
这个想法与编程中的铸造相同:
Animal animal = new Animal();
Dog dog = (Dog)animal; //Tell Java this animal is indeed a Dog (O.K)
现在,您使用JPanel和Container的方案是相同的。
pane = getContentPane(); //Assign Container into JPanel (NOT O.K)
pane = (JPanel)getContentPane(); //Assign Container (casted as JPanel into JPanel) (O.K)
好的,好的。这很奇怪,因为我已经在网络示例的不同代码片段中看到它在没有被投射的情况下工作。例如,检查这个
您指定链接中的代码有效,因为代码仅使用.add()
中的getContentPane()
方法。
注意 :getContentPane()
会返回Container
个对象。
如果您查看documentation of Container,.add()
是Container
类的方法。
因为它正在调用属于Container
类的方法。它肯定会起作用,不需要铸造。
除非您从Container的子类(例如JPanel)调用方法,否则需要进行强制转换。例如,
getContentPane.add(whatever); //Casting NOT needed, add() is a method of Container
((JPanel)getContentPane()).getUI(); //Casting needed, getUI() is a method of JPanel