首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JFrame或Jpanel中重新绘制()方法?

在JFrame或Jpanel中重新绘制()方法?
EN

Stack Overflow用户
提问于 2016-04-02 02:24:48
回答 1查看 3.8K关注 0票数 0

我刚开始学习Java,刚刚开始学习GUI组件。所以,我是头读Java的,有一段代码解释了JPanelJPanel方法。当用户单击“更改颜色”按钮时,只需更改椭圆的颜色。-

代码语言:javascript
运行
复制
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类-

代码语言:javascript
运行
复制
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()方法的部分之外,我从这个示例中获得了所有内容。

书中提到,只要覆盖JPanelJPanel方法,当您调用repaint()时,它将调用paintcomponent来呈现内容(因为我们不直接调用paintcomponent )。

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

object -> component (有重绘法) --> container (有油漆组分法) -->

代码语言:javascript
运行
复制
        `jcomponent` --> `jpanel`

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

所以我认为,由于JFrameJPanel都得到了paintComponentrepaint方法,所以我可能可以扩展Jframe来创建MyDrawPanel,而不是Jpanel,它应该工作得很好。但事实并非如此。它编译得很好,但会抛出运行时异常。

真的很令人沮丧。也许我没有GUI概念,或者我的基础还很薄弱。如果我漏掉了什么很傻的东西请告诉我。

EN

Stack Overflow用户

回答已采纳

发布于 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上执行的任何自定义绘图,并且您应该继续按照它的方式构造代码。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36368485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档