gpt4 book ai didi

java - 使用 repaint() 调用带参数的paintComponent()

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

我对 Java 图形非常陌生,所以只需询问是否需要任何其他信息:)

我正在尝试根据鼠标在屏幕上点击的位置来绘制形状。因此,我需要将单击位置的 x 和 y 坐标传递给 paintComponent() 方法,以便它知道在哪里绘制形状。

public void mouseClicked(MouseEvent e) {
System.out.println("Adding Shape");
repaint();
}

class CanvasDrawArea extends JPanel{
//this should run when the program first starts
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
canvas.setBackground(CANVAS_COLOR);
}

//here is where the question is
public void paintComponent(Graphics g, int x, int y){
super.paintComponent(g);
g.fillRect(x, y, RECTANGLE_WIDTH, RECTANGLE_HEIGHT);
}
}

基本上,我试图通过调用 repaint()/pack() 方法让一个在程序启动时立即运行的 PaintComponent 来重载,以及一个当我给它 x 和 y 坐标时就会运行。但是,我不确定应该如何传递 x 和 y 参数,因为无法在 repaint() 方法中传递它们。

最佳答案

  1. 您永远不需要调用paintComponentpaint需要时,重绘管理器会直接自动调用这些...
  2. 创建java.util.List并存储Point每次鼠标点击其中,调用 repaint来自mouseClicked完成此操作后的方法。
  3. 在您的paintComponent(Graphics)中方法,迭代 List点并绘制您需要的形状。

作为一个简单的例子......

Dotty

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Dotty {

public static void main(String[] args) {
new Dotty();
}

public Dotty() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new DottyPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class DottyPane extends JPanel {

private List<Point> points;

public DottyPane() {
points = new ArrayList<>(25);
addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
points.add(e.getPoint());
repaint();
}

});
}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
for (Point p : points) {
g2d.fillOval(p.x - 5, p.y - 5, 10, 10);
}
g2d.dispose();
}

}

}

关于java - 使用 repaint() 调用带参数的paintComponent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23708522/

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