如何在Swing中制作画布?

30

我正在尝试使用Java制作绘图编辑器,其中有一个工具栏,可以将对象粘贴到画布中。 我正在使用Swing组件来制作GUI,但是当我寻找制作画布的方法时,我只找到了AWT的canvas类。

是否有一种类似于Swing的画布的制作方式?(例如JPanel?)我已经阅读过使用AWT的canvas类和使用Swing制作GUI不能正确运行的情况,这是真的吗?

4个回答

49
为了制作一个自定义的Swing画布,通常需要编写JPanel的子类。然后,您必须重写JPanelprotected paintComponent(Graphics g)方法。
在绘图方法中,您可以在Graphics对象上调用方法来实际绘制JPanel
一如既往,Java教程有一个great reference,可以帮助您入门。

非常有用!我不知道一个JPanel可以如此多元化。 :-) - Kenny Meyer

20

您可能需要创建JPanel的子类,并实现自己的绘制组件方式来绘制面板上想要绘制的内容。

基本方法可能是将MouseListener分配给JPanel的子类,然后实现绘画功能。

基本思路可能是:

class MyCanvas extends JPanel implements MouseListener
{
    Image img;      // Contains the image to draw on MyCanvas

    public MyCanvas()
    {
        // Initialize img here.
        this.addMouseListener(this);
    }

    public void paintComponent(Graphics g)
    {
        // Draws the image to the canvas
        g.drawImage(img, 0, 0, null);
    }

    public void mouseClicked(MouseEvent e)
    {
        int x = e.getX();
        int y = e.getY();

        Graphics g = img.getGraphics();
        g.fillOval(x, y, 3, 3);
        g.dispose();
    }

    // ... other MouseListener methods ... //
}

以上示例不完整(未经测试--肯定无法编译),但它提供了一个关于如何实现一个MyCanvas类,其中用户可以点击并绘制圆形的想法。 img对象用于保存画布的图像。使用paintComponent方法将img对象绘制到画布上。在mouseClicked方法中,检索与img相关联的Graphics对象,以便在图像上绘制fillOval
由于要求之一是将图像粘贴到画布上,因此可能最好保存一些要粘贴到画布上的Image。也许可以考虑以下内容:
Image[] myImages;    // Used to store images to paint to screen.

然后,在将图像绘制到存储在MyCanvas中的img的例行程序中:

g.drawImage(myImage[INDEX_OF_DESIRED_IMAGE], 0, 0, null);

通过使用 Graphics 对象的 drawImage 方法,可以将其他 Image 绘制到 Image 上。
关于AWT和Swing的问题,确实不建议混合使用它们的组件,因为它们在渲染GUI组件方面有所不同。AWT基于重量级组件,意味着它们使用本地窗口来绘制GUI,而Swing基于轻量级组件,意味着GUI由Java自身绘制,而不使用本地组件。
Sun提供了一篇在AWT和Swing中绘画文章,详细介绍了AWT和Swing的区别。

自2009年以来,URL已更改。在http://www.oracle.com/technetwork/java/painting-140037.html上找到文章的实际位置。 - Javier

14

只需简单地继承JComponent

JPanel是一个不合适的类。虽然它看起来自动调用了setOpaque(true),但实际上是PL&F(PLuggable Look and Feel)完成的,而它是否真正发生取决于实现和供应商。

Canvas是一种重量级组件。也就是说,它由底层窗口系统控制。结果是它通常会在顶部绘制Swing组件,而不考虑z-order或裁剪(将其放入滚动窗格中会产生奇怪的行为)。


2
你可能想要看一下Minueto API。这是一个非常简单易用的图形API,你可以将Java事件监听与它结合起来,以提供你的绘图功能。 http://minueto.cs.mcgill.ca/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接