我正在尝试使用Java创建一个绘图编辑器,其中我有一个工具栏,其中包含我要在画布中粘贴的对象。我正在使用Swing组件来制作GUI,但是当我寻找制作画布的方法时,我只从AWT中找到了类画布。
有没有办法用Swing制作类似于画布的东西? (例如,JPanel?)我已经读过,使用AWT的类画布和使用swing制作的GUI将无法正常工作,这是真的吗?
答案 0 :(得分:45)
为了在摇摆中制作自定义'Canvas',你通常会写一个JPanel
的子类。然后,您必须覆盖protected paintComponent(Graphics g)
的{{1}}方法。
在paint方法中,您可以调用Graphics
对象上的方法来实际绘制JPanel
。
与往常一样,Java教程在此基础上有一个great reference来帮助您入门。
答案 1 :(得分:16)
您可能想要创建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
类的想法,用户可以在其中单击并绘制圆圈。< / p>
img
对象用于保存画布的图像。 paintComponent
方法用于将img
对象绘制到画布。在mouseClicked
方法中,检索与Graphics
相关联的img
对象,以fillOval
到图像上。
由于要求是将图像粘贴到画布上,因此最好保留要粘贴到画布中的一些Image
。也许是这样的:
Image[] myImages; // Used to store images to paint to screen.
然后,在例程中将图像绘制到img
中存储的MyCanvas
:
g.drawImage(myImage[INDEX_OF_DESIRED_IMAGE], 0, 0, null);
通过使用drawImage
对象的Graphics
方法,可以将其他Image
绘制到Image
s。
关于AWT和Swing的问题,是的,您确实不想混合AWT和Swing中的组件,因为它们在呈现GUI组件的方式上有所不同。 AWT基于重量级组件,这意味着它们是用于绘制GUI的本机窗口,而Swing基于轻量级组件,这意味着GUI本身是由Java自己绘制的,而不使用本机组件。
Sun的Painting in AWT and Swing文章提供了关于AWT和Swing差异的良好指南。
答案 2 :(得分:13)
简单地继承JComponent
。
JPanel
是一个不合适的课程。通常会建议它自动调用setOpaque(true)
。它实际上就是PL&amp; F,它是否真的发生了实现和供应商的依赖。
Canvas
是一个重量级组件。也就是说它由底层窗口系统控制。结果是它通常会被绘制在Swing组件的顶部,而不考虑z顺序或剪辑(将它放在滚动窗格中会产生奇怪的行为)。
答案 3 :(得分:2)
您可能想要查看Minueto API。使用图形api非常简单,您可以将Java事件监听与它结合起来,以提供绘图功能。