gpt4 book ai didi

java - 如何使用BufferedImage在JPanel上绘制多条曲线?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:11 25 4
gpt4 key购买 nike

最近学习了一个BufferedImage Java类。我应用这个概念用 Java 制作了一个简单的绘画应用程序。但是我无法在面板上绘制任何曲线。我查看了网络上的其他缓冲图像示例,但似乎没有一个适用于我的代码。我是否正确使用了 BufferedImage?如何修复我的代码?

欢迎更改我的源代码

画板类:

import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;

public class PaintBoard extends JPanel implements MouseMotionListener, MouseListener {
private BufferedImage canvas = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB);

private boolean painting;
private int prevX, prevY, curX, curY;
Color canvasColour = Color.WHITE;
int brushSize = 6;
int brushType = 1;
Color currentColour = Color.BLACK;

public PaintBoard() {
setSize(getWidth(), getHeight());
addMouseMotionListener(this);
addMouseListener(this);
}

@Override
public void paintComponent(Graphics board) {
super.paintComponent(board);
board.setColor(canvasColour);
board.fillRect(0, 0, getWidth(), getHeight());
board.drawImage(canvas, 600, 400, this);
}

private void updateBoard() {
Graphics2D paintBrush = canvas.createGraphics();
paintBrush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
paintBrush.setPaint(currentColour);
paintBrush.setStroke(new BasicStroke(brushSize, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
paintBrush.drawLine(prevX, prevY, curX, curY);
repaint();
}

public void mouseDragged(MouseEvent e) {
if (!painting)
return;

curX = e.getX();
curY = e.getY();
updateBoard();
prevX = curX;
prevY = curY;
}

public void mousePressed(MouseEvent e) {
if (painting)
return;

prevX = e.getX();
prevY = e.getY();
painting = true;
}

public void mouseReleased(MouseEvent e) {
if (!painting)
return;

curX = e.getX();
curY = e.getY();
painting = false;
}

public void mouseMoved(MouseEvent e) {}

public void mouseClicked(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}
}

绘画应用:

import javax.swing.*;

public class paintApp extends JApplet {
public void init() {
this.setSize(600, 400);
this.setContentPane(new PaintBoard());
}
}

最佳答案

board.drawImage(canvas, 600, 400, this); - 您正在屏幕外绘制图像(在面板的底部/右边缘)。改为 board.drawImage(canvas, 0, 0, this);

绘画是在组件的坐标空间内完成的,即top/left为0x0

But it just makes the screen black

是的,这是默认图片,你没有用起始颜色填充它

添加类似...

Graphics2D paintBrush = canvas.createGraphics();
paintBrush.setColor(canvasColour);
paintBrush.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
paintBrush.dispose();

到你的PaintBoard的构造函数

可运行的例子....

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

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

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new PaintBoard());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class PaintBoard extends JPanel implements MouseMotionListener, MouseListener {

private BufferedImage canvas = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB);

private int prevX, prevY, curX, curY;
Color canvasColour = Color.WHITE;
int brushSize = 6;
int brushType = 1;
Color currentColour = Color.BLACK;

public PaintBoard() {
setSize(getWidth(), getHeight());
addMouseMotionListener(this);
addMouseListener(this);
Graphics2D paintBrush = canvas.createGraphics();
paintBrush.setColor(canvasColour);
paintBrush.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
paintBrush.dispose();
}

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

@Override
public void paintComponent(Graphics board) {
super.paintComponent(board);
board.drawImage(canvas, 0, 0, this);
}

private void updateBoard() {
Graphics2D paintBrush = canvas.createGraphics();
paintBrush.drawRect(0, 0, canvas.getWidth() - 1, canvas.getHeight() - 1);
paintBrush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
paintBrush.setPaint(currentColour);
paintBrush.setStroke(new BasicStroke(brushSize, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
System.out.println(prevX + "x" + prevY + "-" + curX + "x" + curY);
paintBrush.drawLine(prevX, prevY, curX, curY);
paintBrush.dispose();
repaint();
}

public void mouseDragged(MouseEvent e) {
curX = e.getX();
curY = e.getY();
updateBoard();
prevX = curX;
prevY = curY;
}

public void mousePressed(MouseEvent e) {
prevX = e.getX();
prevY = e.getY();
}

public void mouseReleased(MouseEvent e) {
curX = e.getX();
curY = e.getY();
}

public void mouseMoved(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
}

}

关于java - 如何使用BufferedImage在JPanel上绘制多条曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50849358/

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