JAVA - 帮助绘制扩展画布

时间:2014-10-06 22:57:32

标签: java swing canvas paint extends

所以,我有一个名为MainClass的类,其中扩展了Canvas。我试图让我们说在Canvas上绘制一个填充的矩形而不覆盖paint方法。有没有办法做到这一点,或者我必须覆盖绘画方法,并把我想要的所有画在那里?

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;


public class MainClass extends Canvas {
    MainClass()
    {
        JFrame MainWindow = new JFrame("Main Window");
        MainWindow.setVisible(true);
        MainWindow.setSize(500, 500);
        MainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MainWindow.add(this);
    }

    public void paint(Graphics g)
    {
        super.paint(g);
    }

    public static void main(String[] args)
    {
        MainClass temp = new MainClass();

        Graphics g = (Graphics2D)temp.getGraphics();
        g.setColor(Color.red);
        g.fillRect(0, 0, 400, 400);
        temp.repaint();
    }
}

我的想法是,我有这个类,我可以获得画布的图形对象并直接在其上绘制并重新绘制。或者也许我正在考虑将形状和物体传递给一种能够在某个位置为我绘画的方法。

1 个答案:

答案 0 :(得分:4)

  1. 不要使用Canvas。
  2. 改为扩展JPanel
  3. 并覆盖JPanel的paintComponent方法,而不是paint方法(为什么不覆盖这些方法?你对它们内部绘画的反对意见是什么?)。
  4. 谷歌Java Swing绘画教程并仔细阅读。 Here's the link
  5. 通过在组件上调用getGraphics(),您将获得一个可能在当时正常工作的短暂图形上下文,但如果发生任何重新绘制(并且这些不在您的控制之下)将无法工作,导致程序图形失败或NullPointerException。你应该避免这样做,除非你有迫切需要并知道你在做什么。要了解你正在做什么",请阅读Haase和Guy的书Filthy Rich Clients
  6. 请注意,您始终可以使用从图像派生的Graphics对象直接在BufferedImage上绘制,但是您仍然应该在paintComponent(...)方法覆盖中绘制BufferedImage。