如何用Swing制作canvas?
我正在尝试使用Java编写一个画图编辑器,其中有一个工具栏,其中包含要粘贴在canvas上的对象。 我使用Swing组件来创buildGUI,但是当我寻找制作canvas的方式时,我只能从AWT中find类canvas。
有没有什么办法可以和Swing做类似的canvas? (例如,JPanel?)我已经读过使用AWT的类canvas与用swing制作的GUI将无法正常工作,这是真的吗?
为了在swing中定制一个“Canvas”,你通常会写一个JPanel
的子类。 然后,您必须覆盖protected paintComponent(Graphics g)
的protected paintComponent(Graphics g)
方法。
在paint方法中,可以调用Graphics
对象上的方法来实际在JPanel
上绘制。
与往常一样,Java教程对此有很大的参考帮助您入门。
您可能需要创buildJPanel
的子类,并实现自己的绘画方法来绘制要绘制到面板上的组件。
基本方法可能是沿着将一个MouseListener
分配给JPanel
的子类,然后实现绘画function。
基本思想可能是沿着以下方向的东西:
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 ... // }
上面的例子是不完整的(没有经过testing – 它肯定不会编译),但它提供了一个关于如何实现一个MyCanvas
类的概念,用户可以点击并MyCanvas
。
img
对象用于保存canvas的图像。 paintComponent
方法用于将img
对象绘制到canvas上。 在mouseClicked
方法中,与img
相关联的Graphics
对象被检索以fillOval
到图像上。
由于要求是将图像粘贴到canvas上,因此最好将一些要粘贴到canvas上的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
是一个不合适的课程。 通常会build议它自动调用setOpaque(true)
。 实际上,PL&F是这样做的,它实际上是否是实现和供应商的依赖。
Canvas
是一个重量级的组件。 也就是说它是由底层窗口系统控制的。 结果是,它通常会被绘制在Swing组件的顶部,而不考虑z顺序或剪裁(将其放在滚动窗格中会给出奇怪的行为)。
你可能想看看Minueto API。 使用graphicsAPI是一个非常简单的方法,您可以将Java事件与它一起进行组合,以提供您的绘图function。