gpt4 book ai didi

java - Java Swing - 通过拖动鼠标绘制线条 : Why does my code work?

转载 作者:行者123 更新时间:2023-12-02 03:45:00 24 4
gpt4 key购买 nike

我正在学习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() 方法时,会向 RepaintManager 发出请求。然后,RepaintManager 将(可能)将多个 repaint() 请求合并到对组件的 paint() 方法的一次调用中,进而调用该组件的 paint() 方法将调用 paintComponent() 方法。

因此,当调用 paintComponent() 方法时,repaint() 语句之后的语句已经执行,因此 x/y 值已经更新。

您应该始终在方法开始时调用 super.paintComponent() 以确保背景被清除。如果您想进行增量绘画,请查看 Custom Painting Approaches这解释了执行此操作的两种常见方法。

关于java - Java Swing - 通过拖动鼠标绘制线条 : Why does my code work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36388707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com