gpt4 book ai didi

java - PaintComponent 方法仅被调用一次

转载 作者:行者123 更新时间:2023-12-01 19:53:25 25 4
gpt4 key购买 nike

我正在尝试编写简单的程序,当鼠标拖动时绘制圆圈,但paintComponent方法仅被调用一次(启动后)。

在这个类中,我有一些在拖动鼠标时绘制圆圈的方法。

import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import java.awt.event.*;
import java.awt.geom.Line2D;

public class PaintingField extends JPanel implements MouseMotionListener {
int x,y;

public PaintingField(){
setPreferredSize((new Dimension(500,500)));
x = -1;
y = -1;
}

@Override
public void mouseDragged(MouseEvent e) {
x = e.getX();
y = e.getY();
System.out.println(x + " " + y);
repaint();
}

@Override
public void mouseMoved(MouseEvent e) {

}

@Override
public void paintComponent(Graphics g) {
System.out.println("painting");
if(x == -1 || y == -1)
return;

g.drawOval(x, y, 10, 10);
}
}

在这里,我创建了一个绘画类的对象并将其添加到我的主 Frame 类中。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import static javax.swing.GroupLayout.Alignment.CENTER;

public class PatternCreator extends JFrame {

JButton save = new JButton("save");
JButton load = new JButton("load");
JButton clear = new JButton("clear");
JButton chooseFolder = new JButton("choose folder");
JTextField path = new JTextField("");
PaintingField paintingField = new PaintingField();

public PatternCreator(){
createLayout();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
addMouseMotionListener(new PaintingField());
}

public void createLayout(){
JPanel pane = (JPanel) getContentPane();
GroupLayout groupLayout = new GroupLayout(pane);
pane.setLayout(groupLayout);

groupLayout.setAutoCreateContainerGaps(true);
groupLayout.setAutoCreateGaps(true);

groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(CENTER)
.addGroup(groupLayout.createSequentialGroup()
.addComponent(save)
.addComponent(load)
.addComponent(clear)
.addComponent(chooseFolder))
.addGroup(groupLayout.createSequentialGroup()
.addComponent(paintingField,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE))
.addGroup(groupLayout.createSequentialGroup()
.addComponent(path))
);
groupLayout.setVerticalGroup(groupLayout.createSequentialGroup()
.addGroup(groupLayout.createParallelGroup()
.addComponent(save)
.addComponent(load)
.addComponent(clear)
.addComponent(chooseFolder))
.addGroup(groupLayout.createParallelGroup()
.addComponent(paintingField,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE))
.addGroup(groupLayout.createParallelGroup()
.addComponent(path))
);

pack();
}

}

以及主要方法。

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

public class TextRecognition {

public static void main(String args[]) {
EventQueue.invokeLater(() -> {
PatternCreator patternCreator = new PatternCreator();
});
}

}

调用mouseDragged方法,因为打印光标位置,所以也调用了repaint。有人可以解释一下为什么不调用paintComponent方法吗?

最佳答案

您正在将 PaintingField 的新实例注册为鼠标监听器,而不是之前创建的对象。

替换:

addMouseMotionListener(new PaintingField());

与:

addMouseMotionListener(paintingField);

此外,您的 paintComponent 方法应该调用父方法,以确保所有内容都正确清除。

super.paintComponent(g);

最后一点,为了避免组件坐标问题,您应该直接在 PaintingField 面板上注册鼠标监听器。

因此,请尝试将以下内容放入 PaintingField 的构造函数中

addMouseMotionListener(this);

并从 PatternCreator 中删除 addMouseMotionListener(paintingField)

关于java - PaintComponent 方法仅被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50487880/

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