29

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

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

4

4 回答 4

47

为了在摇摆中制作自定义“画布”,您通常编写一个JPanel. 然后,您必须覆盖 的protected paintComponent(Graphics g)方法JPanel

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

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

于 2009-04-22T08:36:42.127 回答
20

您可能想要创建一个子类JPanel并实现您自己的方式来绘制您想要绘制到面板上的组件。

基本方法可能是将 a 分配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方法中,检索Graphics与之关联的对象img以便fillOval放到图像上。

由于其中一个要求是将图像粘贴到画布上,因此保留一些Image要粘贴到画布中的 s 可能是个好主意。也许是这样的:

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

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

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

通过使用对象的drawImage方法,可以将Graphics其他Images绘制到Images上。


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

Sun的用 AWT 和 Swing 绘制文章中提供了关于 AWT 和 Swing 区别的一个很好的指南。

于 2009-04-22T08:27:28.763 回答
13

简单的子类JComponent

JPanel是一个不合适的类。通常建议使用它,因为它似乎已setOpaque(true)自动调用它。实际上是 PL&F 做到了这一点,它是否真的发生取决于实施和供应商。

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

于 2009-04-22T09:59:58.057 回答
2

您可能想查看 Minueto API。它是一个非常简单易用的图形 api,您可以结合 Java 事件监听来提供您的绘图能力。

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

于 2009-04-30T14:02:31.733 回答