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 自定义绘图 的相关文章

随机推荐

  • 如何调用分配给变量的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