【问题标题】:Java Graphics - Keeping track of shapesJava Graphics - 跟踪形状
【发布时间】:2013-06-26 19:04:10
【问题描述】:

所以我正在制作一个应用程序,我想跟踪添加到屏幕上的形状。到目前为止,我有以下代码,但是当添加一个圆圈时,它无法移动/更改。理想情况下,我想要像 shift-click 这样的东西来移动/突出显示它。

我也想知道我怎样才能做到,这样你就可以将一条线从一个圆圈拖到另一个圆圈。我不知道我是否在这里使用了错误的工具来完成这项工作,但我们将不胜感激。

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();
  }
}

【问题讨论】:

    标签: java swing graphics shapes


    【解决方案1】:

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

    例如:

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

    【讨论】:

    • 图形是伪的。我指的是您正在使用的任何图形对象。您的示例使用“g”作为参考。试试 g.draw()
    • +1 用于使用 Shapes 进行绘画。但是,Graphics 类不知道如何绘制 Shapes。您需要使用 Graphics2D 类。你也应该使用fill() 方法。 draw() 方法只是绘制 Shape 的轮廓。请参阅Playing With Shapes 了解更多信息。
    【解决方案2】:

    1) 请参阅this 答案以单击/选择绘制的对象,here 以通过按下和拖动鼠标创建线条。

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

    宁可将JPanel 添加到JFrame 并覆盖JPanel 中的paintComponent(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 的实现,你必须遵守 opaque 属性,即如果此组件是不透明的,则必须 以非透明颜色完全填充背景。如果你不 尊重 opaque 属性,您可能会看到视觉伪影。

    3) 不要在JFrame 上调用setSize 使用正确的LayoutManager 和/或覆盖getPreferredSize(通常在绘制到JPanel 时完成,因此它可能适合我们的图形内容),而不是调用pack() on JFrame 在设置为可见之前。

    4) 阅读Concurrecny in Swing,尤其是Event-Dispatch-Thread

    【讨论】:

    • 我刚刚注意到你超过了 20K!恭喜,这是当之无愧的。 :)
    • +1 呵呵,谢谢,我觉得我可以说我对 Swing 有点了解 :)!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多