【发布时间】:2016-04-03 17:31:14
【问题描述】:
我正在学习 Swing 的基础知识,并且我设法让这个程序通过拖动鼠标来绘制一条线。
public class SwingPaintDemo2 {
public static void main(String[] args) {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300,300);
f.add(new MyPanel());
f.setVisible(true);
}
}
class MyPanel extends JPanel {
private int x, y, x2, y2;
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
});
}
public void paintComponent(Graphics g){
// super.paintComponent(g);
g.setColor(Color.BLACK);
g.drawLine(x, y, x2, y2);
x = x2;
y = y2;
}
}
我有两个问题:
1) 如果我打电话给super.paintComponent(g) 什么都没画,那是为什么呢?
2) 在上面的代码中,我将x, y 重置为等于paintComponenet() 中的x2, y2,但我最初尝试在mouseDragged 中重置它们,如下所示:
public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
repaint();
x = x2;
y = y2;
}
但是,这并没有创建线,只是创建了一系列点。据我了解,这两种方法应该是等效的。它们有何不同?
【问题讨论】:
-
我很确定第二个是因为每次移动鼠标时都会重新绘制整个组件。重新绘制包括背景颜色的绘制,这意味着每次重新绘制时都会擦除先前的绘制。所以你只看到了画的最后一点。
-
我想我还是不太明白。
repaint()在这两种情况下都会被调用。两者之间的唯一区别是方法错误,我尝试在mouseDragged和paintComponent中重置x, y。 -
对于
repaint(),请阅读文档。 docs.oracle.com/javase/8/docs/api/java/awt/…repaint()是 Swing 的标志,表明组件需要绘制,但不会立即发生。
标签: java swing mouseevent paintcomponent repaint