如何用Swing制作画布?

2022-09-01 12:29:29

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

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


答案 1

为了在摇摆中创建自定义的“Canvas”,您通常会编写JPanel的子类。然后,您必须覆盖 的方法。protected paintComponent(Graphics g)JPanel

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

与往常一样,Java教程在这方面有很好的参考,可以帮助您入门。


答案 2

您可能希望创建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

该对象用于保存画布的图像。该方法用于将对象绘制到画布上。在该方法中,检索与关联的对象以将其放到图像上。imgpaintComponentimgmouseClickedGraphicsimgfillOval

由于要求是将图像粘贴到画布上,因此最好保留一些要粘贴到画布中的图像。也许有些东西是这样的:Image

Image[] myImages;    // Used to store images to paint to screen.

然后,在例程中将图像绘制到存储中:imgMyCanvas

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

通过使用图形对象的 drawImage 方法,可以将其他 s 绘制到 s 上。ImageImage


至于关于AWT和Swing的问题,是的,您确实不想混合使用AWT和Swing中的组件,因为它们在呈现GUI组件的方式上有所不同。AWT基于重量级组件,这意味着它们具有用于绘制GUI的本机窗口,而Swing基于轻量级组件,这意味着GUI由Java本身绘制,而无需使用本机组件。

关于AWT和Swing差异的良好指南在Sun的Awt和Swing文章中提供了绘画。


推荐