我有一个任务是使用 swing 和鼠标监听器制作一个简单的绘图应用程序。应用程序必须具有三个类,一个包含 Main,一个包含框架,最后一个包含绘图。老师给了我们一个源代码,我们应该用它来完成作业,它看起来像这样:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class Drawsome extends JFrame implements MouseMotionListener {
public Drawsome(){
setSize(300,400);
setForeground(Color.black);
show();;
addMouseMotionListener(this);
}
public void mouseDragged(MouseEvent evt) {
start = end;
end = new Point(evt.getX(),evt.getY());
repaint();
}
public void mouseMoved(MouseEvent evt) {
end = null;
}
public void paint(Graphics g) {
if (start!=null && end!=null)
g.drawLine(start.x, start.y, end.x, end.y);
}
public void update(Graphics g) {
paint(g);
}
Point start=null;
Point end=null;
}
现在这个工作完美了,但是由于我们必须在另一个类中制作框架,所以我尝试这样做:
import java.awt.Color;
import javax.swing.JFrame;
public class MainWindow extends JFrame {
public MainWindow() {
setSize(300,400);
setForeground(Color.black);
show();;
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class Drawsome extends JFrame implements MouseMotionListener {
public Drawsome(){
MainWindow mainwindow = new MainWindow();
addMouseMotionListener(this);
} (rest is the same as the previous code)
我会得到一个框架,但其余的不起作用,我不明白我做错了什么,并且非常感谢朝正确方向的插入
最佳答案
你老师的源代码很糟糕,因为你永远不应该在paint方法或JFrame中绘图,而且他/她的paint重写不会调用super的方法,从而破坏了绘画链。他们似乎不知道自己在做什么。
话虽如此,您的主驱动程序不应扩展 JFrame,也不应尝试创建它的 JFrame 甚至它的实例。相反,在此类的 main 方法中,创建可怕的绘图类的实例。
请注意,我不明白这个要求:
and the last one that makes the drawing.
请发布确切要求。
<小时/>如果这是我的应用程序,我会
- 在 JPanel 中进行绘图,而不是 JFrame
- 在 JPanel 的
paintComponent
方法中执行此操作,而不是在 Paint 方法中。 - 请务必在 JPanel 的
paintComponent
方法重写中调用 super 的paintComponent
方法。 - 然后将我的 JPanel 放入 JFrame 中以显示它。
- 我不会让我的 GUI 类实现 MouseListener,而是为此使用嵌套内部类。
关于java - 使用 swing 和鼠标监听器制作绘图应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418952/