JPanel 使用 Graphics 自定义绘图

2023-11-21

我有一个自定义 JPanel,有时在我的程序中,我需要调用一个将屏幕绘制为黑色的方法,就是这样。

public void clearScreen() {
    Graphics g = getGraphics();
    g.setColor(Color.black);
    g.fillRect(0,0,getWidth(),getHeight());
}

当我启动程序时,我调用这个方法。

然而,我发现有时有效,有时无效。这很奇怪。我还发现,当它不起作用时,图形对象不为空,并且宽度和高度也被正确定义(来自 getWidth() 和 getHeight())。

为什么这有时有效有时无效?

在程序中的某个时刻在 JPanel 上进行自定义绘图的正确方法是什么?像我一样使用 getGraphics() 是否正确?我的 JPanel(在某些时候)有 JComponent,但后来我删除了这些 JComponent 并进行了一些自定义图形绘制。为什么这有时会起作用?


不要通过在 JPanel 等组件上调用 getGraphics 来获取 Graphics 对象,因为获得的 Graphics 对象不会在下次重新绘制时保留(这可能是问题的根源)。

相反,请考虑在 BufferedImage 中进行所有绘图,并且then您可以随心所欲地使用 getGraphics() 。如果您这样做,请不要忘记在完成绘画后处理 Graphics 对象。

e.g.,

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPaint extends JPanel {
   public static final int IMG_WIDTH = 400;
   public static final int IMG_HEIGHT = IMG_WIDTH;

   private BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT,
            BufferedImage.TYPE_INT_ARGB);

   public MyPaint() {
      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (image != null) {
         g.drawImage(image, 0, 0, null);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(IMG_WIDTH, IMG_HEIGHT);
   }

   public void clearScreen() {
      Graphics g = image.getGraphics();
      g.setColor(Color.black);
      g.fillRect(0, 0, image.getWidth(), image.getHeight());
      g.dispose();
      repaint();
   }

   private class MyMouseAdapter extends MouseAdapter {
      // code to draw on the buffered image. 
      // Don't forget to call repaint() on the "this" JPanel
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPanel 使用 Graphics 自定义绘图 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 如何调用分配给变量的javascript函数?

    function test1 do something 要调用上面的函数 我只需要写test1 var check day function select d do something 如何调用分配给变量的函数 同样的方式 使用括号调用函数
  • 谷歌地图的标记未在 iframe 中居中

    我对在 iframe 中打开谷歌地图有一点奇怪的要求 我有地址 我用它来传递并将其转换为谷歌地图 但问题是我的 iframe 的大小是 200 200 所以标记没有居中 另一个问题是标记信息窗口也会在几秒钟后弹出 这使我的标记超出框架边界
  • 将骨干模型绑定到 Marionette ItemView - 阻塞 .fetch()?

    这是一个由 2 部分组成的问题 1 是否有更好的方法将模型异步渲染到视图 我目前正在使用 ajax 请求fetch模型中的方法 尽管我在初始化时显式调用它 then使用应用程序事件呈现模板化视图 vent 在之后从模型内部发布parse方法
  • 如何制作带有图像填充的JLabel BorderLayout.CENTER

    我有一个 JFrame 并将 LayoutManager 设置为 BorderLayout 然后继续添加带有图像的 JLabel 但是 当我调整框架大小时 JLabel 不会调整大小 我没有向North S E等添加任何组件 我希望简单地让
  • 如何在 Gridview 中的 RowDataBound 事件中更改 Eval() 字段的值

    我有一个网格视图
  • 处理与 Django 中的应用程序无关的静态文件

    在文档中https docs djangoproject com en dev howto static files 我读到静态文件应该与各自的应用程序放在一起并调用 load staticfiles img src css base cs
  • requestLegacyExternalStorage 在 Android 11 - API 30 中不起作用

    Google 最近在 API 29 中引入了一些与存储 API 相关的更改 例如范围存储 我们通过在 Manifest 中添加 requestLegacyExternalStorage true 来选择退出 但现在当我的 targetSdk
  • 如何提高 JAXB 性能?

    这是我的转换代码 当我们处理大数据时 这需要很长时间 调用该方法几乎一百万次 我们可以清楚地看到它持有线程一段时间 请建议我一些提高性能的方法 public class GenericObjectXMLConverter
  • Scala 类型推理混乱:有还是没有?

    原始版本 trait Animal F A case class Cat F I A limits F I f I gt A extends Animal F A object ConfuseMe def confuse F A tt An
  • 使用转换器直接绑定到 DataContext 时的 WPF 更新绑定

    通常 当您希望数据绑定控件 更新 时 您可以使用 PropertyChanged 事件向界面发出信号 表明数据已在后台发生更改 例如 您可以有一个文本块 该文本块通过属性 DisplayText 绑定到数据上下文
  • 操作/编辑现有 xml 文档的最佳 java Xml 解析器

    任务 我有一个现有的 xml 文档 UTF 8 它使用 xml 命名空间和 xml 模式 我需要解析特定元素 将内容 还需要使用 xml 命名空间前缀 附加到该元素 然后再次写出文档 我应该使用哪个最佳的 XML 解析器库来完成此任务 我看
  • JSONObject 中的 JSONObject

    我有一个这样的 API 输出 user status stat1 54 stats2 87 我创建一个简单的JSONObject从这个 API 中 JSONObject json getJSONfromURL URL 之后我可以像这样读取用
  • 使用 Swift 执行“killall”时不允许进行操作

    我正在尝试创建一个菜单栏应用程序来隐藏桌面图标 并希望其他各种东西主要是为了了解有关 Swift 的更多信息 但由于某种原因我无法让它工作 当我运行该程序并单击其中一个菜单项时 没有任何反应 并且我在控制台中收到此警告 killall wa
  • 如何在 Vim 中每次按键时将当前缓冲区的内容写回文件?

    我希望 Vim 尽可能频繁地自动写入我的文件 理想的情况是每次击键 我需要定期保存 以便我的后台构建过程能够看到它 它是 LaTeX 文档的 makefile 我希望预览器在我完成输入后向我显示一个几乎最新的文档 最终解决方案 下面的答案有
  • genymotion player.exe 停止工作

    当我尝试启动 genymotion Android 模拟器时 它给我一个错误 player exe 已停止工作我尝试寻找答案并发现this但是 我之前遇到了 open gl 2 0 问题 为此我更新了显卡驱动程序 我的主板是华硕 P5G41
  • 更新 matplotlib 动画中的 x 轴标签

    这是一段说明我的问题的玩具代码 import numpy as np import matplotlib pyplot as plt from matplotlib animation import FuncAnimation fig ax
  • 在字符串中每 3 个字符后插入句点

    我有这个 from future import print function def f comma p string v string p string if type v string type int or type v string
  • 为什么要写 `window[ "eval" ].call( window, data );`

    jQuery 1 7rc1 第 614 行 window eval call window data 为什么不简单地写 eval call window data 答案在这里 解码 jQuery Jim Driscoll 发现对于更尊重标准
  • Git 如何处理符号链接?

    如果我有一个文件或目录是符号链接 并且我将其提交到 Git 存储库 那么它会发生什么情况 我假设它会将其保留为符号链接 直到文件被删除 然后如果您从旧版本中拉回文件 它只会创建一个普通文件 当我删除它引用的文件时它会做什么 它只是提交悬空链
  • JPanel 使用 Graphics 自定义绘图

    我有一个自定义 JPanel 有时在我的程序中 我需要调用一个将屏幕绘制为黑色的方法 就是这样 public void clearScreen Graphics g getGraphics g setColor Color black g