我正在尝试使用Java制作绘图编辑器,其中有一个工具栏,可以将对象粘贴到画布中。 我正在使用Swing组件来制作GUI,但是当我寻找制作画布的方法时,我只找到了AWT的canvas类。
是否有一种类似于Swing的画布的制作方式?(例如JPanel?)我已经阅读过使用AWT的canvas类和使用Swing制作GUI不能正确运行的情况,这是真的吗?
我正在尝试使用Java制作绘图编辑器,其中有一个工具栏,可以将对象粘贴到画布中。 我正在使用Swing组件来制作GUI,但是当我寻找制作画布的方法时,我只找到了AWT的canvas类。
是否有一种类似于Swing的画布的制作方式?(例如JPanel?)我已经阅读过使用AWT的canvas类和使用Swing制作GUI不能正确运行的情况,这是真的吗?
JPanel
的子类。然后,您必须重写JPanel
的protected paintComponent(Graphics g)
方法。Graphics
对象上调用方法来实际绘制JPanel
。您可能需要创建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
。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
上。
只需简单地继承JComponent
。
JPanel
是一个不合适的类。虽然它看起来自动调用了setOpaque(true)
,但实际上是PL&F(PLuggable Look and Feel)完成的,而它是否真正发生取决于实现和供应商。
Canvas
是一种重量级组件。也就是说,它由底层窗口系统控制。结果是它通常会在顶部绘制Swing组件,而不考虑z-order或裁剪(将其放入滚动窗格中会产生奇怪的行为)。