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)
{
}
}
我想使用多边形制作三角形并通过单击鼠标来设置坐标。 编译器没有显示错误,任何人都可以帮忙吗? .................................................. .................................................. .................................................. .................................................. ..
答案 0 :(得分:2)
为了调试此类应用程序,您可以在正确的位置添加println()
行。虽然这听起来有些幼稚,但在某些情况下,这种称为 printf
- 调试的调试方法甚至被最专业的开发人员使用。
我建议您添加System.err.println("1")
resp。在System.err.println("2")
System.err.println("3")
的每个if
分支中mouseClicked()
/ i
找出为什么它没有正确记录积分。提示:您可能希望变量MouseListener
具有与现在不同的范围。
不应在paintComponent()
中注册MouseListener
。如果你对此有所了解,那应该是显而易见的。问问自己:我多久需要注册一次paintComponent()
?只有一次。 addMouseListener()
多久被召唤一次?多次。所以,JPanel
肯定是在错误的地方。
修复这些后,您可能会注意到必须隐藏/取消隐藏,调整大小或(在某些操作系统上)移动窗口以重绘多边形。这是因为一旦你通过记录多边形的新坐标来改变外观,你就不会告诉Java该组件需要重新绘制。
您应用的编程模型使用扩展名仍然会在许多网页和今天的许多书籍中显示,但它显然是错误的,因为它经常违反 LSP - Liskov替换原则。在你的情况下,扩展PolygonsPanel的JPanel几乎是正确的,因为这是一种绘画画布,实际上是一个新组件,因此,创建一个新组件是一个完美的组件。只有JFrame
可能不是它的最佳超类,稍微检查一下Swing类的类层次结构,你会发现一个更好的超类。但是,在Triangle中,您实际上并不想扩展JFrame
,只需使用{{1}}而不向其添加任何新的可重用功能,因此在这种情况下子类化是不正确的。