Java图形 - 追踪形状

4

我正在制作一个应用程序,希望能跟踪屏幕上添加的形状。目前我有以下代码,但是当添加圆形时,它不能被移动/更改。理想情况下,我希望像按住Shift键并单击一样来移动它/突出显示它。

我还想知道如何使您可以从一个圆形拖动一条线到另一个圆形。我不知道是否在这里使用了错误的工具,但是任何帮助都将不胜感激。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MappingApp extends JFrame implements MouseListener { 

  private int x=50;   // leftmost pixel in circle has this x-coordinate
  private int y=50;   // topmost  pixel in circle has this y-coordinate

  public MappingApp() {
    setSize(800,800);
    setLocation(100,100);
    addMouseListener(this); 
    setVisible(true);
  }

  // paint is called automatically when program begins, when window is
  //   refreshed and  when repaint() is invoked 
  public void paint(Graphics g) {
    g.setColor(Color.yellow);
    g.fillOval(x,y,100,100);

}

  // The next 4 methods must be defined, but you won't use them.
  public void mouseReleased(MouseEvent e ) { }
  public void mouseEntered(MouseEvent e)   { }
  public void mouseExited(MouseEvent e)    { }
  public void mousePressed(MouseEvent e)   { }

  public void mouseClicked(MouseEvent e) { 
    x = e.getX();   // x-coordinate of the mouse click
    y = e.getY();   // y-coordinate of the mouse click
    repaint();    //calls paint()
  }

  public static void main(String argv[]) {
    DrawCircle c = new DrawCircle();
  }
}
3个回答

5
使用java.awt.geom.*创建形状,使用字段引用它们,然后使用图形对象将其绘制出来。
例如:
Ellipse2D.Float ellipse=new Ellipse2D.Float(50,50,100,100);

graphics.draw(ellipse);

图形是伪图形。我指的是您正在使用的任何图形对象。您的示例使用“g”作为引用。尝试g.draw()。 - Nikki
+1 用形状绘画。不过,Graphics类不知道如何绘制形状,需要使用Graphics2D类。而且应该使用fill()方法,因为draw()方法只会描绘形状的轮廓。更多信息请参见《Playing With Shapes》(http://tips4java.wordpress.com/2013/05/13/playing-with-shapes/)。 - camickr

4

1) 有关绘制对象的点击/选择,请参见此答案以及通过鼠标按下和拖动创建线条的方法

2) 你不应该覆盖JFrame paint(..)方法。

相反,应将JPanel添加到JFrame中,并覆盖JPanelpaintComponent(Graphics g)方法,不要忘记在重写方法的第一行调用super.paintComponent(g);

@Override
protected void paintComponent(Graphics g) {
   super.paintComponent(g);

   g.setColor(Color.yellow);
   g.fillOval(x,y,100,100);

}

根据paintComponent(Graphics g)文档: 另外,如果您未调用super的实现,则必须尊重不透明属性,即,如果此组件是不透明的,则必须完全使用非不透明颜色填充背景。如果您不遵守不透明属性,则可能会看到视觉伪影。
3)不要在JFrame上调用setSize,应当使用正确的LayoutManager和(或更好地)覆盖getPreferredSize(通常在绘制到JPanel时完成,以便适应我们的图形内容),然后在设置可见性之前在JFrame上调用pack()
4)阅读有关Swing中的并发,尤其是事件分派线程

3
我刚刚注意到你已经超过了2万个!恭喜,你真的是太值得了。 :) - Andrew Thompson
2
+1 哈哈,谢谢。我感觉我可能能说我对Swing有点了解了 :)! - David Kroukamp

0
你正在扩展JFrame,因此应该考虑在重写的paint方法的开头调用super.paint(g)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接