您可能想要创建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 区别的良好指南。