Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用鼠标侦听器Java创建多边形_Java_Swing - Fatal编程技术网

使用鼠标侦听器Java创建多边形

使用鼠标侦听器Java创建多边形,java,swing,Java,Swing,我想使用多边形制作三角形,并通过单击鼠标设置坐标。 编译器没有显示错误,有人能帮忙吗? 为了调试此类应用程序,您可以在正确的位置添加println()行。虽然这听起来有点幼稚,但这种被称为printf-调试的方法在某些情况下甚至被最专业的开发人员使用 我建议您添加一个System.err.println(“1”)respSystem.err.println(“2”)/System.err.println(“3”),找出它没有正确记录点的原因。提示:您可能希望变量i的作用域与现在的不同 不应在pa

我想使用多边形制作三角形,并通过单击鼠标设置坐标。 编译器没有显示错误,有人能帮忙吗?

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

我建议您添加一个
System.err.println(“1”)
resp<在
mouseClicked()
的每个
if
-分支中的code>System.err.println(“2”)/
System.err.println(“3”)
,找出它没有正确记录点的原因。提示:您可能希望变量
i
的作用域与现在的不同

不应在
paintComponent()
中注册
MouseListener
。如果你想一想,这应该是显而易见的。扪心自问:我需要多久注册一次鼠标听器?只有一次。调用
paintComponent()
的频率是多少?很多次。因此,
addMouseListener()
肯定位于错误的位置

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


到今天为止,您所应用的扩展编程模型用法仍然显示在许多网页和书籍中,但这显然是错误的,因为它经常违反LSP-Liskov替换原则。在您的例子中,为PolygonsPanel扩展JPanel几乎是正确的,因为这是一种绘画画布,实际上是一个新的组件,因此,创建一个新的类作为一个组件是完美的。Just
JPanel
可能不是它最好的超类,稍微检查一下Swing类的类层次结构,您将发现一个更好的超类。然而,在Triangle中,您并不真正想要扩展
JFrame
,您只需要使用
JFrame
,而不向其添加任何新的可重用功能,因此在这种情况下子类化是不正确的。

对于1Mio MouseListener,再加上一个
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)
        {

        }


    }