【问题标题】:How to make canvas with Swing?如何用 Swing 制作画布?
【发布时间】:2019-01-07 04:27:07
【问题描述】:

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

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

【问题讨论】:

    标签: java swing user-interface java-canvas


    【解决方案1】:

    为了在 Swing 中制作自定义“画布”,您通常编写 JPanel 的子类。然后,你必须覆盖JPanelprotected paintComponent(Graphics g)方法。

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

    与往常一样,Java 教程有一个 great reference 来帮助您入门。

    【讨论】:

    • 非常有用!我不知道 JPanel 可以如此多元。 :-)
    【解决方案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 类的想法,用户可以在其中点击并绘制圆圈。

    img 对象用于保存画布的图像。 paintComponent 方法用于将img 对象绘制到画布上。在mouseClicked 方法中,检索与img 关联的Graphics 对象,以便将fillOval 放到图像上。

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

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

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

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

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


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

    Sun 的Painting in AWT and Swing 文章中提供了关于 AWT 和 Swing 区别的良好指南。

    【讨论】:

    【解决方案3】:

    简单地继承JComponent

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-11
        • 2013-08-18
        • 2022-01-24
        • 2021-03-14
        • 2023-03-20
        • 2021-06-18
        • 2011-03-09
        • 1970-01-01
        相关资源
        最近更新 更多