2014-12-02 101 views
-2
import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 
import java.util.*; 
import javax.swing.event.*; 
import javax.swing.JPanel; 

public class Triangle extends JFrame 
{ 
    public Triangle() 
    { 
    add(new PolygonsPanel()); 
    } 

    public static void main(String [] args) 
    { 
     Triangle t = new Triangle(); 
     t.setSize(500,500); 
     t.setTitle("Triangle"); 
     t.setVisible(true); 
     t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     t.setLocationRelativeTo(null); 
    } 
} 

class PolygonsPanel extends JPanel implements MouseListener 
    { 
    private int x1,x2,x3,y1,y2,y3; 
    @Override 
    protected void paintComponent(Graphics g) 
     { 
     super.paintComponent(g); 

     Polygon p = new Polygon(); 

     p.addPoint(x1,y1); 
     p.addPoint(x2,y2); 
     p.addPoint(x3,y3); 
     this.addMouseListener(this); 

     g.drawPolygon(p); 
     } 

     public void mouseExited(MouseEvent e) 
     { 

     } 
     public void mouseEntered(MouseEvent e) 
     { 

     } 
     public void mouseClicked(MouseEvent e) 
     { 
      int i = 0; 
      if(i==0) 
      { 
      int x1= e.getX(); 
      int y1= e.getY(); 
      i++; 
      } 
      else if(i==1) 
      { 
      int x2= e.getX(); 
      int y2= e.getY(); 
      i++; 
      } 
      else if(i==2) 
      { 
      int x3= e.getX(); 
      int y3= e.getY(); 
      i++; 
      } 

     } 
     public void mousePressed(MouseEvent e) 
     { 

     } 
     public void mouseReleased(MouseEvent e) 
     { 

     } 


    } 

我想使用多边形制作三角形并通过单击鼠标来设置坐标。编译器没有显示错误,任何人都可以帮忙吗? ................................................. .................................................. .................................................. .................................................. ...使用鼠标监听器创建多边形Java

回答

2

为了调试这些应用程序,您可以在正确的位置添加println()行。尽管这听起来有些幼稚,但在某些情况下,这种调试方法甚至被最专业的开发人员使用,称为printf -Debugging

我建议你增加一个System.err.println("1") resp。 System.err.println("2")/System.err.println("3")if的每个分支mouseClicked()中找出为什么它没有正确记录点。提示:您可能希望变量i具有与现在不同的范围。

注册MouseListener不应在paintComponent()中完成。如果您对此有所了解,应该很明显。问问自己:我需要多久注册一次MouseListener?只有一次。 paintComponent()多久拨打一次?多次。所以,addMouseListener()当然是在错误的地方。

一旦您修复了这些问题,您可能会注意到您必须隐藏/取消隐藏,调整大小或(在某些操作系统上)移动窗口才能重绘多边形。这是因为一旦通过记录多边形的新坐标来改变外观,就不会告诉Java该组件需要重绘。

编程模型使用由应用仍然是许多网页和许多书籍,今天的显示扩展,但它显然是错误的,因为它往往违反了LSP - 里氏替换原则。在你的情况下,扩展一个PolygonsPanel的JPanel几乎是正确的,因为这是一种绘画画布,它实际上是一个新的组件,所以创建一个新的组件是一个完美的组件。只是JPanel可能不是最好的超类,稍微检查一下Swing类的类层次结构,你会发现一个更好的超类。但是,在Triangle中,你并不想扩展JFrame,只需使用JFrame而不添加任何新的可重用特性,因此在这种情况下子类化不正确。

+0

加上一个用于1Mio MouseLinsteners – mKorbel 2014-12-02 08:36:51