我正在尝试使用 Java 制作一个绘画编辑器,其中我有一个工具栏,其中包含我想粘贴到画布中的对象。我正在使用 Swing 组件制作 GUI,但是当我寻找制作画布的方法时,我只找到了 AWT 的类画布。
有没有办法用 Swing 制作类似于画布的东西?(例如,JPanel?)我已经读过使用 AWT 的类画布和用 swing 制作的 GUI 将无法正常工作,是这样吗?
我正在尝试使用 Java 制作一个绘画编辑器,其中我有一个工具栏,其中包含我想粘贴到画布中的对象。我正在使用 Swing 组件制作 GUI,但是当我寻找制作画布的方法时,我只找到了 AWT 的类画布。
有没有办法用 Swing 制作类似于画布的东西?(例如,JPanel?)我已经读过使用 AWT 的类画布和用 swing 制作的 GUI 将无法正常工作,是这样吗?
您可能想要创建一个子类JPanel
并实现您自己的方式来绘制您想要绘制到面板上的组件。
基本方法可能是将 a 分配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
方法中,检索Graphics
与之关联的对象img
以便fillOval
放到图像上。
由于其中一个要求是将图像粘贴到画布上,因此保留一些Image
要粘贴到画布中的 s 可能是个好主意。也许是这样的:
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
s绘制到Image
s上。
至于关于 AWT 和 Swing 的问题,是的,您确实不想混合 AWT 和 Swing 中的组件,因为它们呈现 GUI 组件的方式不同。AWT 基于重量级组件,这意味着它们是用于绘制 GUI 的本机窗口,而 Swing 是基于轻量级组件,这意味着 GUI 由 Java 本身绘制,而不使用本机组件。
Sun的用 AWT 和 Swing 绘制文章中提供了关于 AWT 和 Swing 区别的一个很好的指南。
简单的子类JComponent
。
JPanel
是一个不合适的类。通常建议使用它,因为它似乎已setOpaque(true)
自动调用它。实际上是 PL&F 做到了这一点,它是否真的发生取决于实施和供应商。
Canvas
是重量级组件。也就是说它是由底层的窗口系统控制的。结果是它通常会被绘制在 Swing 组件的顶部,而不考虑 z 顺序或裁剪(将它放在滚动窗格中会产生奇怪的行为)。
您可能想查看 Minueto API。它是一个非常简单易用的图形 api,您可以结合 Java 事件监听来提供您的绘图能力。