繁体   English   中英

如何使用Swing制作画布?

[英]How to make canvas with Swing?

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

有没有办法用Swing制作类似于画布的东西? (例如,JPanel?)我已经读过,使用AWT的类画布和使用swing制作的GUI将无法正常工作,这是真的吗?

为了在swing中制作自定义的'Canvas',你通常会编写一个JPanel的子类。 然后,你必须覆盖protected paintComponent(Graphics g)的方法JPanel

在paint方法中,您可以调用Graphics对象上的方法来实际绘制JPanel

与往常一样,Java教程有一个很好的参考 ,以帮助您入门。

您可能想要创建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的问题,是的,你确实不想混合AWT和Swing中的组件,因为它们在呈现GUI组件方面有所不同。 AWT基于重量级组件,这意味着它们是用于绘制GUI的本机窗口,而Swing基于轻量级组件,这意味着GUI本身是由Java自己绘制的,而不使用本机组件。

关于AWT和Swing差异的一个很好的指南在Sun的AWT和Swing文章中提供。

简单地将JComponent子类化。

JPanel是一个不合适的类。 它经常被建议,因为它似乎自动调用setOpaque(true) 它实际上是PL&F做到这一点,它是否实际发生是依赖于实现和供应商。

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

您可能想要查看Minueto API。 使用图形api非常简单,您可以将Java事件监听与它结合起来,以提供您的绘图功能。

http://minueto.cs.mcgill.ca/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM