gpt4 book ai didi

java - JFrame 或 Jpanel 中的 repaint() 方法?

转载 作者:行者123 更新时间:2023-12-02 03:45:05 25 4
gpt4 key购买 nike

我是 Java 新手,刚刚开始学习 GUI 组件。因此,我正在阅读 Headfirst Java,其中有一段代码解释了 JPanelpaintcomponent 方法。只是每当用户单击“更改颜色”按钮时更改椭圆形的颜色。 -

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() 方法的部分之外,我从这个示例中得到了所有内容。

书中提到,只要重写JPanelpaintcomponent方法,当你调用repaint()时,它就会调用paintcomponent 渲染内容(因为我们不直接调用 paintcomponent)。

现在,我通过扩展 JPanel 创建了 MyDrawPanel 类并重写其 paintComponent 方法。现在,当我们将drawPanel小部件放在框架上然后单击鼠标时,repint()方法将被调用。但是这个 repaint() 方法是使用 frame(JFrame 的一个对象)来调用的。根据我对 java 的基本理解,如果我使用对象调用方法,则该方法必须位于该类或某个父类(super class)中。我不明白在 frame 上调用 repaint() 将如何触发 MyDrawPanel 的绘制组件。我做了一些挖掘,看看 JFrameJPanel 是否共享相同的层次结构,这是我发现的:

对象 -->组件(有重绘方法)-->容器(有paintComponent方法)-->

        `jcomponent` --> `jpanel`

`window` --> `frame` --> `jframe`

所以我想既然 JFrameJPanel 都得到 paintComponentrepaint 方法,也许我可以扩展Jframe来创建MyDrawPanel而不是Jpanel,它应该可以正常工作。但事实并非如此。它编译得很好,但抛出运行时异常。

真是令人沮丧。可能是我没有掌握 GUI 概念或者我的基础知识仍然很薄弱。如果我在这里遗漏了一些非常愚蠢的东西,请告诉我。

最佳答案

让我们从 paintComponent 开始,在执行任何自定义绘画之前应该真正调用 super.paintComponent

然后继续你真的应该阅读 Painting in AWT and SwingPerforming Custom Painting为了更好地理解 Swing 中绘画的工作原理。 repaint 不会直接调用 paintComponent,它会要求 RepaintManager 在事件队列上安排一个 paint 事件,在未来的某个时刻,由事件调度线程处理,然后根据容器的需要处理 paint 事件

So I thought that since JFrame and JComponent both get paintComponent

不,他们没有。 JFrame(及其父类)没有 paintComponent 方法

may be I can extend Jframe to create MyDrawPanel instead of Jpanel and it should work fine"

不,你不应该这样做,除了 JFrame 没有 paintComponent 之外,还有很多事情可能会干扰你可能尝试的任何自定义绘制在 JFrame 上执行,您应该继续按原样构建代码

关于java - JFrame 或 Jpanel 中的 repaint() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36368485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com