我刚开始学习Java,刚刚开始学习GUI组件。所以,我是头读Java的,有一段代码解释了JPanel
的JPanel
方法。当用户单击“更改颜色”按钮时,只需更改椭圆的颜色。-
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleGui3C implements ActionListener {
JFrame frame;
public static void main(String[] args) {
SimpleGui3C gui = new SimpleGui3C();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Change colors");
button.addActionListener(this);
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, button);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.setSize(500,500);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}
MyDrawPanel类-
import javax.swing.*;
import java.awt.*;
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
// GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.orange);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color startColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color endColor = new Color(red, green, blue);
GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
g2d.setPaint(gradient);
g2d.fillOval(70,70,100,100);
}
}
除了调用repaint()
方法的部分之外,我从这个示例中获得了所有内容。
书中提到,只要覆盖JPanel
的JPanel
方法,当您调用repaint()
时,它将调用paintcomponent
来呈现内容(因为我们不直接调用paintcomponent
)。
现在,我通过扩展MyDrawPanel
创建了JPanel
类,并重写了它的paintComponent
方法。现在,当我们将drawPanel
小部件放在框架上,然后在鼠标单击时,就调用了repint()
方法。但是这个repaint()
方法是使用frame
( JFrame
的一个对象)调用的。根据我的基本java理解,如果我使用对象调用方法,则该方法必须位于该类或某些超级类中。我看不出在frame
上调用frame
将如何触发MyDrawPanel
的油漆组件。我做了一些调查,看看JFrame
和JPanel
是否共享相同的层次结构,下面是我发现的:
object
-> component
(有重绘法) --> container
(有油漆组分法) -->
`jcomponent` --> `jpanel`
`window` --> `frame` --> `jframe`
所以我认为,由于JFrame
和JPanel
都得到了paintComponent
和repaint
方法,所以我可能可以扩展Jframe
来创建MyDrawPanel
,而不是Jpanel
,它应该工作得很好。但事实并非如此。它编译得很好,但会抛出运行时异常。
真的很令人沮丧。也许我没有GUI概念,或者我的基础还很薄弱。如果我漏掉了什么很傻的东西请告诉我。
发布于 2016-04-02 02:31:23
让我们从paintComponent
开始,在执行任何自定义绘图之前,应该真正调用super.paintComponent
接下来,你真的应该阅读AWT和Swing中的绘画和表演定制绘画,以更好地理解绘画是如何在秋千中工作的。repaint
不直接调用paintComponent
,它要求RepaintManager
在事件队列上调度paint
事件,这在将来的某个时候由事件分派线程处理,然后根据容器的需要处理paint
事件
所以我想既然JFrame和JComponent都得到了paintComponent
JFrame
(和它的父类)没有paintComponent
方法
也许我可以扩展Jframe来创建MyDrawPanel,而不是Jpanel,它应该工作得很好。“
不,您不应该这样做,除了JFrame
没有paintComponent
之外,还有更多的事情可以干扰您可能尝试在JFrame
上执行的任何自定义绘图,并且您应该继续按照它的方式构造代码。
https://stackoverflow.com/questions/36368485
复制相似问题