使用Swing,我想画几点
…在图像中并对其[xy]坐标进行一些计算。
我的第一个想法是使用图像作为JPanel的背景,然后注册点,但我不确定是否有办法在JPanel上标记这些。 还有我不熟悉的绘图库,但我不确定我是否可以将它们与Swing结合起来。
你能说出我可以使用的包/类来完成任务吗? 已经提供的代码的参考也是受欢迎的。
谢谢!
这里的问题有三个方面:
- 需要有一种方法来显示背景图像。
- 必须能够找到点击鼠标的点。
- 必须有一种方法来在面板上绘制点。
实现上述要点的一种方法是子类化JPanel
并提供这些function。
1.在面板中显示背景图像。
首先,由于JPanel
默认情况下无法显示背景图像,因此必须有一种方法可以在JPanel
保存图像,然后在面板上绘制它,这可以通过paintComponent
方法执行。
实现此目的的一种方法是在类中有一个字段,用于绘制要绘制的Image
:
class MyPanel extends JPanel { // Background image. Initialize appropriately. Image backgroundImage; public void paintComponent(Graphics g) { super.paintComponent(g); // Draw background image each time the panel is repainted. g.drawImage(backgroundImage, 0, 0, null); } }
paintComponent
的Graphics
对象与MyPanel
关联,可用于执行图形操作。
2.找到单击鼠标的点。
其次,为了检索单击鼠标的点,可以将MouseListener
分配给MyPanel
。 在下面的示例中,扩展MouseAdapter
的匿名内部类用于最小化编写额外代码:
class MyPanel extends JPanel { // Background image. Initialize appropriately. Image backgroundImage; public MyPanel() { // Add a MouseListener which processes mouse clicks. this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // Process mouse-click. } }) } // paintComponents method here. }
单击鼠标时需要执行的处理可以包含在mouseClicked
方法中。
3.如何在面板上画一个点。
第三,为了找到点击鼠标的一个点,可以从mouseClicked
方法传入的MouseEvent
对象中获取它:
class MyPanel extends JPanel { // Background image. Initialize appropriately. Image backgroundImage; Point pointClicked; public MyPanel() { // Add a MouseListener which processes mouse clicks. this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // Retrieve the point at which the mouse was clicked. pointClicked = e.getPoint(); // Repaint the panel. this.repaint(); } }) } public void paintComponent(Graphics g) { super.paintComponent(g); // Draw background image each time the panel is repainted. g.drawImage(backgroundImage, 0, 0, null); // Draw a little square at where the mouse was clicked. g.fillRect(pointClicked.x, pointClicked.y, 1, 1); } }
虽然上面的代码没有经过测试,但它应该是一个起点。
例如,如果需要绘制多个点,可能有一个List
来保存点,并且可以在paintComponents
方法中绘制每个Point
。
如果在单击鼠标时需要执行其他处理,则可以向mouseClicked
方法添加其他代码。
其他资源:
- 课程:执行自定义绘画
- 在AWT和Swing中绘画
- 如何编写鼠标侦听器
感谢zedoo在注释中指出在覆盖paintComponent
方法时应该执行对super.paintComponent
的调用。
子类化JPanel并覆盖方法paintComponent:
public void paintComponent(Graphics g) { super.paintComponent(g); }
在该方法中,您可以使用传递给它的Graphics对象的方法。 每次需要重绘面板时都会调用此方法,因此您需要将点存储在数组中,然后在paintComponent中读取和绘制每个点。
您可能还会发现这很有用,如果您需要重量级组件(AWT), 本教程将介绍如何扩展Canvas类以绘制内容。
背景面板提供了一些关于如何根据您的要求显示背景图像的建议。
如果需要向图像添加自定义点,则自定义绘制方法会提供有关如何进行自定义绘制的一些想法。