当前位置: 首页 > 面试题库 >

使用Graphics的JPanel自定义绘图

澹台承载
2023-03-14
问题内容

我有一个自定义的JPanel,有时在我的整个程序中,我需要调用一个将屏幕涂成黑色的方法,仅此而已。

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

启动程序时,我将调用此方法。

但是,我发现有时它起作用,有时却不起作用。这很奇怪。我还发现,当它不起作用时,图形对象不是null,并且宽度和高度也已正确定义(来自getWidth()和getHeight())。

为什么这有时行得通,有时却行不通?

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


问题答案:

不要通过在诸如JPanel之类的组件上调用getGraphics来获取Graphics对象,因为获得的Graphics对象将不会在下一次重绘时持续存在(这很可能是问题的根源)。

相反,可以考虑在BufferedImage中进行所有绘制, 然后
可以对自己的内心使用getGraphics()。如果执行此操作,请在完成绘制后不要忘记处理Graphics对象。

例如,

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
   }
}


 类似资料:
  • 问题内容: 我正在尝试制作绘画程序的项目中。到目前为止,我已经使用Netbeans来创建GUI并设置程序。 到目前为止,我已经能够调用在其中绘制所需的所有坐标,但是我对如何在其中实际绘制感到非常困惑。 在我的代码接近尾声时,我在面板内部进行绘制的尝试失败。 谁能在这样的示例中解释/显示如何使用图形? 我发现的所有示例都创建了一个类并对其进行扩展,JPanel但是我不知道是否可以这样做,因为它是在n

  • 关于您要更改的注释添加公共显示(图形g) [链接]http://www3.canyons.edu/faculty/biblej/project6.html 1.)Project6类必须扩展JFrame类2.)Project6构造函数必须设置GUI窗口3.)一个新的抽象方法:public void display(Graphics g);应该添加到基和派生类4.)一个自定义JPanel必须使用pai

  • Java自定义拖放--对TransferHandler没有回调。 我想为JPanel子类实现自定义拖放功能。I遵循标准DnD教程的指导方针: 拖放和数据传输 从表面上看,事情似乎很进步,但当我实际尝试时,我没有得到任何迹象表明任何DnD行为正在发生。事实上,没有调用我的TransferHandler中的任何方法。 所以,让我们回顾一下我所做的... 我创建了自己的容器类,它声明自己来扩展JPane

  • 但是,我的程序稍后尝试将一个新的JPanel添加到类的扩展JPanel中,方法是: 这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占用整个屏幕。将布局设置为null将完全破坏框架,除了框架的最小化和关闭按钮之外,什么也没有出

  • 我正在尝试为我的应用程序的主题定义自定义颜色。我是这样做的: 定义自定义属性: 定义应用程序样式: 在清单中设置样式: 在可绘制xml中使用此属性: 但出于某种原因,它不适用于我的颜色绘图。它应用了透明的颜色。 还有一件奇怪的事,如果我替换我的与,在,则应用正确的颜色。 最后一个问题是:你知道为什么它不起作用,以及如何修复它吗?

  • 本文向大家介绍Android使用GridLayout绘制自定义日历控件,包括了Android使用GridLayout绘制自定义日历控件的使用技巧和注意事项,需要的朋友参考一下 效果图 思路:就是先设置Gridlayout的行列数,然后往里面放置一定数目的自定义日历按钮控件,最后实现日历逻辑就可以了。 步骤: 第一步:自定义日历控件(初步) 第二步:实现自定义单个日期按钮控件 第三步:将第二步得到的