yap*_*m01 6 java swing awt jcomponent jpanel
我正在玩Java Swing,当谈到JPanel和JComponent时我真的很困惑.根据CoreJava Vol 1(cay horstmann):
一些程序员喜欢扩展JPanel类,而不是扩展JComponent.JPanel旨在成为可以包含其他组件的容器,但也可以在其上绘制.只有一个区别.面板是不透明的,这意味着它负责绘制其边界内的所有像素.最简单的方法是使用背景颜色绘制面板,方法是在每个面板子类的paintComponent方法中调用super.paintComponent:
class NotHelloWorldPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
. . . // code for drawing will go here
}
}
Run Code Online (Sandbox Code Playgroud)
我知道什么是不透明的.他的意思是'面板是不透明的......负责绘制其边界内的所有像素'?如果我正确阅读它会说面板会在其边界内绘制自己的区域.不是JComponent也这样做吗?
底线是我看不出JPanel和JComponent之间的区别.有一个简单的例子,我真的可以看到它吗?
任何帮助表示赞赏
JComponent不需要绘制其绑定的所有像素.它可能会保持透明,因此您可以看到它背后的组件.
需要JPanel来绘制所有像素.
当然,如果你super.paintComponent(..)
在任何一种情况下都没有调用这个方法,那么它们或多或少都是等价的,因为你抛弃了JPanel将绘制整个面板的保证.
简而言之,不同之处在于已经存在的方法(即涂料成分).
编辑:
使用JComponent实现的球类示例如下所示:
(这不适用于JPanel,因为JPanel是不透明的,并且球将具有方形背景.你不能打电话super.paintComponent
,但作为一般规则你总是应该,或者你打破了组件的真正含义.如果我通过将JPanel变成某种东西,他们希望它是一个JPanel,而不是一个像JComponent一样被攻击的JPanel)
public class Ball extends JComponent
{
public Ball(int x, int y, int diameter)
{
super();
this.setLocation(x, y);
this.setSize(diameter, diameter);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(0, 0, width, height);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11185 次 |
最近记录: |