使用Swing,我想画几点

…在图像中并对其[xy]坐标进行一些计算。

我的第一个想法是使用图像作为JPanel的背景,然后注册点,但我不确定是否有办法在JPanel上标记这些。 还有我不熟悉的绘图库,但我不确定我是否可以将它们与Swing结合起来。

你能说出我可以使用的包/类来完成任务吗? 已经提供的代码的参考也是受欢迎的。

谢谢!

这里的问题有三个方面:

  1. 需要有一种方法来显示背景图像。
  2. 必须能够找到点击鼠标的点。
  3. 必须有一种方法来在面板上绘制点。

实现上述要点的一种方法是子类化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); } } 

paintComponentGraphics对象与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类以绘制内容。

背景面板提供了一些关于如何根据您的要求显示背景图像的建议。

如果需要向图像添加自定义点,则自定义绘制方法会提供有关如何进行自定义绘制的一些想法。