使用鼠标侦听器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)
{
}
}