当前位置: 首页 > 知识库问答 >
问题:

在JFrame或JPanel中的Repaint()方法?

湛骏祥
2023-03-14

我是新来的Java,刚刚开始学习图形用户界面组件。所以,我正在阅读HeadfirstJava,有一个代码解释了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()方法的部分。

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

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

对象--

        `jcomponent` --> `jpanel`

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

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

真令人沮丧。可能是我没有掌握GUI概念,或者我的基础知识仍然薄弱。如果我错过了一些非常愚蠢的事情,请告诉我。

共有1个答案

昌山
2023-03-14

让我们从paintComponent开始,它应该真正调用super。在执行任何自定义绘制之前,先绘制组件

接下来,你真的应该阅读AWT和Swing中的绘画以及执行定制绘画,以便更好地理解Swing中的绘画工作方式repaint不直接调用paintComponent,它要求RepaintManager在事件队列上安排一个paint事件,该事件在将来的某个时候由事件调度线程处理,然后根据容器的需要处理paint事件

所以我想既然JFrame和JComponent都获得了油漆组件

不,他们没有。JFrame(它是父类)没有油漆组件方法

也许我可以扩展Jframe来创建MyDrawPanel而不是Jpanel,它应该可以正常工作。”

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

 类似资料:
  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

  • 我是Java GUI编程新手,对何时使用哪些工具有几个问题。 当我的应用程序运行时,会出现一个JFrame,它使用内容面板显示用户3个按钮。我希望每个按钮都能显示不同的屏幕,但不能在单独的窗口中打开。为了实现这一点,我目前正在处理当前的JFrame,并用新内容创建一个新的JFrame。以下是我的问题。 > 我应该为每一次按钮点击创建一个新的JPanel,而不是创建一个新的JFrame吗?如果这个问

  • 问题内容: 我正在学习Java gui。我学会了创建窗口的方法是继承或扩展类,并且很好地使用它,因为它包含窗口的所有属性。现在,如果要在此窗口中添加一些内容,则需要使用方法。但是今天我碰到了一个窗口,我们可以通过添加东西。 两种方法有什么区别?它们之间有某种联系吗? 问题答案: 您不应不必要地扩展该类(仅当您向该类添加其他功能时) JFrame : 扩展和。 它是一个顶层容器,用于表示窗口的最低要

  • 我有一个带有卡布局组件的JFrame。我正在使用卡布局在应用程序执行的不同时刻在不同的JPanel之间切换。在某些时候,我正在使用摇摆工人对象来生成一些XML文件。在这段时间里,我想在我的窗口中显示另一个JPanel,告诉用户等待。在这个JPanel上,我想在3个标签之间切换。 吉列布尔1会说:“请稍候。 吉拉贝尔2会说:“请稍候..” 吉拉贝尔3会是:“请稍候...” 现在代码如下: Swing

  • 我正在学习Java GUI。我学习创建窗口的方法是继承或扩展类,使用它是很好的,因为包含窗口的所有属性。现在如果我想在这个窗口中添加一些东西,我需要使用方法。但是今天我遇到了,它也创建了一个windows,我们可以通过添加内容。 这两种方法有什么区别?他们有什么关系吗?

  • 我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。