如何用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。

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