Java Graphics - 跟踪形状

时间:2013-06-28 22:01:15

标签: java swing graphics shapes

所以我正在制作一个应用程序,我想跟踪添加到屏幕的形状。到目前为止,我有以下代码,但是当添加一个圆时,它无法移动/更改。理想情况下,我想要像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 个答案:

答案 0 :(得分:5)

使用java.awt.geom。*创建形状,使用字段引用它们,然后使用图形对象绘制它们。

例如:

Ellipse2D.Float ellipse=new Ellipse2D.Float(50,50,100,100);

graphics.draw(ellipse);

答案 1 :(得分:4)

1)点击/选择绘制的对象,查看this答案,点击鼠标拖动鼠标,查看here创建线条。

2)您不应该覆盖JFrame paint(..)

而是将JPanel添加到JFrame并覆盖paintComponent(Graphics g)的{​​{1}},并且忘记在覆盖方法中调用JPanel作为第一个调用:

super.paintComponent(g);

根据paintComponent(Graphics g)文档:

  

此外,如果你没有调用super super的实现,你必须尊重   opaque属性,即如果此组件是不透明的,则必须   以非不透明的颜色完全填充背景。如果你不   尊重不透明属性,你可能会看到视觉文物。

3)不要在@Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.yellow); g.fillOval(x,y,100,100); } 上致电setSize使用正确的JFrame和/或覆盖LayoutManager(通常在绘制到getPreferredSize时完成,以便它可能适合我们图形内容),然后在JPanel上调用pack(),然后再将其设置为可见。

4)阅读Concurrecny in Swing,特别是Event-Dispatch-Thread

答案 2 :(得分:0)

您正在扩展JFrame,因此您应该考虑调用super.paint(g);在被覆盖的绘画方法的开头。