对JPanel函数的关注:paintComponent()

2024-04-04

你好,我是java编程新手,我需要有人向我解释这些代码行:

 public class drawpanel extends JPanel
 {
     public void paintComponent(Graphics g)
     { 
         super.paintComponent(g);
         ...
     }
 }

我不明白这句话public void paintComponent(Graphics g):如果 JPanel 中预定义了该函数,为什么我必须声明该函数?

还有这条线super.paintComponent(g): 完全看不懂。感谢您的帮助。


基本结构:

The extends关键字的意思是DrawPanel继承自JPanel。换句话说,DrawPanel "is a" JPanel。因此,它可以重写它的方法(那些没有标记的方法)final)。您可能出于多种原因想要这样做。例如,您可能想要访问面板的Graphics类,您可以使用它在面板上绘制圆圈、条形图或文本字符串。

如果您不重写任何方法,那么当您扩展时JPanel你会得到这样的东西:

public class DrawPanel extends JPanel {
    //TODO not much
}

然而,这不是很有用......除非你只是不喜欢这个名字JPanel并想称呼它AwesomePanel反而 (注意:不要这样做)。如果这就是你所拥有的一切,那么你最好只创建一个instance of JPanel, 像这样:JPanel drawPanel = new JPanel();


油漆成分:

延长的目的JPanel是要覆盖paintComponent方法。这JPanel在您覆盖之前是不可见的paintComponent (注意:不可见使其成为按钮和其他组件的有用容器)。你是对的paintComponent方法是预先定义的(在JComponent类(如果您想知道的话),但该方法所做的只是创建一个空的JPanel。如果你想在面板上绘制一些东西,那么你需要覆盖它,如下所示:

public class DrawPanel extends JPanel {
    @Override public void paintComponent(Graphics g) { // <-- HERE!
        //TODO draw stuff
    }
}

注: 的 @Override 部分并不是绝对必要的,但包含它是一个很好的做法,因为它可以减少运行时错误的数量并提高代码的可读性

您现在可以访问Graphics object g对于面板。Graphics是一个帮助程序类,允许您在面板上绘制内容,如下所示:

public class DrawPanel extends JPanel {
    @Override public void paintComponent(Graphics g) {
        g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel
    }
}

超级.paintComponent:

有用的比喻(我刚刚编的): JPanel 是画布, Graphics 对象是你的画笔,并且 super.paintComponent(g) 是你的橡皮擦。 (还, JFrame 是你的画架。)

So super.paintComponent(g)调用paintComponent来自超类的方法JPanel (the JComponentclass) 来擦除当前在面板上绘制的任何内容。这对于动画很有用。

例如,考虑在面板上绘制一个模拟时钟。你需要每秒刷新它,所以每一秒你都必须擦除之前的时钟并重新绘制时钟,调整秒针。如果你不调用super.paintComponent(g)在重新绘制时钟之前,它会继续在旧时钟之上绘制新时钟,60 秒后,您将或多或少地看到一个填充的圆圈。

只需记住一件事:始终致电super.paintComponent(g)首先在paintComponent方法,像这样:

public class DrawPanel extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g); // <-- HERE!
        g.drawOval(50, 50, 50, 50);
    }
}

就是这样。随时联系我。


Example:

我创建了一个简单的示例,它使用这些概念在面板(放置在框架内)上显示文本字符串。在 IDE 中另存为测试面板.java.

import java.awt.*;
import java.util.*;
import javax.swing.*;

/**
 * A frame containing a panel that is sometimes red and sometimes 
 * blue. Also, it displays the word to go with it. 
 * 
 * Inspired by www.sometimesredsometimesblue.com.
 *
 */
public class TestPanel extends JPanel {

    private Random random = new Random();
    private boolean isRed;
    private String s = "";

    public TestPanel() {
        //randomly determine whether the background should be red
        isRed = random.nextBoolean();

        //set the background to blue
        setBackground(Color.BLUE);
        s = "BLUE";

        //if 'isRed' is true, set the background to red
        if (isRed) {
            setBackground(Color.RED);
            s = "RED";
        }
    }

    @Override 
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        //write either "RED" or "BLUE" using graphics
        g.setColor(Color.WHITE);
        g.setFont(new Font("serif", Font.BOLD, 60));
        g.drawString(s, getWidth() / 2 - g.getFontMetrics().stringWidth(s) / 2,
                getHeight() / 2 + g.getFontMetrics().getHeight() / 2);
    }

    //main method: create an instance of TestPanel and output it on a JFrame
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setSize(500, 500);
        f.setTitle("Sometimes Red, Sometimes Blue");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new TestPanel());
        f.setVisible(true);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对JPanel函数的关注:paintComponent() 的相关文章

随机推荐

  • 使用 Vim 命令打开标记中的当前文件

    我一直在尝试为 Brett Terpstra 的 Marked 应用程序创建一个命令 不幸的是我无法让它工作 上标记奖励包 http support markedapp com kb how to tips and tricks marke
  • 使用 Python 将 JSON 插入 MySQL

    我有一个 Python 中的 JSON 对象 我正在使用 Python DB API 和 SimpleJson 我正在尝试将 json 插入 MySQL 表中 目前出现错误 我相信这是由于 JSON 对象中的单引号 造成的 如何使用 Pyt
  • 如何识别该图像中的矩形?

    我有一张带有水平线和垂直线的图像 事实上 这张图片是BBC网站转换成水平线和垂直线的 我的问题是我希望能够找到图像中的所有矩形 我想编写一个计算机程序来查找所有矩形 有谁知道如何做到这一点或提出有关如何开始的想法 作为一个人 这个任务对于我
  • 为什么 Bootstrap 的滚动间谍不工作?

    我有一个简单的 Bootstrap 模式设置 在模式中我有内容nav并设置了滚动间谍 但是 它不起作用 我看到它被激活 但导航从未更新 完整的源代码在这里太长了 你将无法看到我得到的效果 所以我设置了一个jsfiddle http jsfi
  • AAudio 或 OpenSL

    我开始用 C 实现我的游戏音频部分 我看到有 2 个可用的音频框架 AAudio https developer android com ndk guides audio aaudio aaudio html https developer
  • 如何在Unity3D中创建脚本图标?

    I created a scipt and editor for it Now I want to assosiate an icon with it like this 这样的事该怎么办呢 找不到任何文档 http unity3d com
  • 如何从 .NET Core 3.0 WPF 应用程序使用 SOAP Web 服务

    I have a SOAP web service I want to consume it in my WPF app I am using NET Core 3 0 Visual Studio 2019 So I used the Mi
  • 如何计算两个时间字符串之间的时间间隔

    我有两个时间 一个开始时间和一个停止时间 格式为 10 33 26 HH MM SS 我需要两个时间之间的差异 我一直在浏览 Python 文档并在线搜索 我想它可能与日期时间和 或时间模块有关 我无法让它正常工作 并且只在涉及约会时寻找如
  • 在 do...while 中将相关表达式匹配设置为 false

    我正在尝试编写一些非常基本的代码 但我也在正则表达式上挑战自己 我已经能够将代码搞乱到一定程度 但我真正遇到的问题是我试图在表达式为 false 时运行 do while 循环 此时我完全没有收到任何错误 但 do while 循环继续运行
  • 线程冻结主 UI

    Hello我目前正在编写一个服务器监控应用程序 Classes public class Server public string SERVERNAME public string ENVIRONMENT public string VER
  • java.lang.ClassNotFoundException: org.springframework.orm.hibernate4.LocalSessionFactoryBean

    我是 Spring 新手 这是我的第一个示例 JSF 2 PrimeFaces 3 Spring 和 Hibernate 集成 这是pom xml
  • 如何将数组(即列表)列转换为向量

    问题的简短版本 考虑以下代码片段 假设spark已经设置为一些SparkSession from pyspark sql import Row source data Row city Chicago temperatures 1 0 2
  • MATLAB 错误:“以前似乎被用作函数或命令”

    我想创建一个名为 E7stats 的函数 它对 csv 文件中包含的第一个期中考试的分数执行简单的统计分析 该函数接受一个字符串输入 filename csv 文件的名称 并返回一个输出 一个 1 2 结构体数组 S 其两个条目都包含四个字
  • PHP include 导致页面顶部出现空白

    我正在制作的网站遇到问题 我的页面顶部有一行空白 我不知道它是从哪里来的 这可能是因为 php 在我的页面中出现了额外的换行符include 或者可能只是一些有问题的CSS 我得到了它 我必须承认 这是一件非常奇怪的事情 This http
  • 如何总结水晶报表中的公式字段?

    如何在水晶报表中的公式字段上添加运行总计或汇总字段 Sample Report Serial No Premium Commission Net Premium Commission 1 10 4 6 2 40 30 10
  • 解决方案资源管理器中的 Visual Studio 心形叠加。这是什么意思?

    在解决方案资源管理器中 您有时会在类定义节点中看到心形覆盖 它意味着什么 我相信您指的是信号图标 当类型 成员是内部 C 或朋友 VB NET 时 心形会显示在类型 成员上 图标的含义是记录在 Microsoft 文档中 https lea
  • Openpyxl如何通过索引从工作表中获取行

    使用 Openpyxl 和 python3 5 我尝试使用下标从 Excel 工作表中获取第一行 但出现错误 after getting filename after loading worksheet to get the first r
  • C# NotifyIcon ShowBalloonTip 超时

    在我的 C 2 0 框架 应用程序中 我使用通知图标控件 我想从此控件中显示气球提示 但是 showBalloonTip 事件我限制为超时 我想永远显示这个气球 我尝试使用一个计时器来一次又一次地显示气球 但在 vista 中 气球有淡入淡
  • mb_convert_case 未定义函数(Symfony2 FOS/UserBundle)

    在我的 Symfony2 应用程序上 我收到错误 致命错误 在第 18 行 Applications MAMP htdocs application vendor bundles FOS UserBundle Util Canonicali
  • 对JPanel函数的关注:paintComponent()

    你好 我是java编程新手 我需要有人向我解释这些代码行 public class drawpanel extends JPanel public void paintComponent Graphics g super paintComp