gpt4 book ai didi

java - PaintComponent(Graphics) 方法不起作用

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

我是Java新手,我正在尝试制作一个简单的绘画程序,用户按下按钮通过鼠标拖动来绘制线条

我的问题是,尽管保存了每条线的属性,但线并未在 Canvas 上绘制。当我尝试用“鼠标释放”的方法画线时,它起作用了,所以我认为问题出在“PaintComponent”上,但我找不到它。

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

public class GUI extends JPanel{
public JFrame frame = new JFrame();
public Canvas canvas = new Canvas();
private Point p1,p2;
private List<pro> lineList = new ArrayList<>();
private pro currentLine = null;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI window = new GUI();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public GUI() {
initialize();
}

public void paintComponent(Graphics page) {
super.paintComponent(page);
for (pro line : lineList) {
line.draw(page);
System.out.println(line);
}

if (currentLine != null) {
currentLine.draw(page);
}
}

private void initialize(){

frame.getContentPane().setBackground(Color.BLACK);
frame.setBounds(0, 0, 346, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.getContentPane().add(canvas);
Canvas canvas = new Canvas();
canvas.setLocation(10, 10);
canvas.setSize(200, 241);
canvas.setBackground(Color.DARK_GRAY);
frame.getContentPane().add(canvas);

JButton btnLine = new JButton("Line");
frame.getContentPane().add(btnLine);
btnLine.setBackground(Color.DARK_GRAY);
btnLine.setForeground(Color.RED);
btnLine.setFont(new Font("Stencil", Font.BOLD, 16));


btnLine.addActionListener(new ActionListener() {
int x1;
int y1;
public void actionPerformed(ActionEvent e) {
canvas.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
currentLine = null;
}
public void mouseReleased(MouseEvent e) {
pro line = createLine(e,Color.red);
lineList.add(line);
currentLine = null;
canvas.repaint();
}
});
canvas.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
currentLine = createLine(e, Color.white);
repaint();
}
});
}
private pro createLine(MouseEvent e, Color currentColor) {
int x2 = e.getX();
int y2 = e.getY();
return new pro(x1, x2, y1, y2, currentColor);
}

});
btnLine.setBounds(229, 95, 91, 31);
frame.getContentPane().add(btnLine);

}

class pro {

private int x1, x2, y1, y2;
private Color color;

public pro(int x1, int x2, int y1, int y2, Color color) {
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
this.color = color;
}

public void draw(Graphics page) {
page.setColor(color);
page.drawLine(x1, y1, x2, y2);
}
}

}

最佳答案

JFrame 并不意味着覆盖 paintComponent:它们是多层容器。如果您想绘制自定义组件,请创建 JComponent(或 JPanel)的子类,然后将其放入 JFrame<(的内容 Pane )中.

这对我有用:

public class SketchPad extends JComponent {
private final List<Line> lineList = new ArrayList<>();
private Line currentLine = null;
private Color drawingColor = Color.RED;

public SketchPad() {
initialize();
}

public Color getDrawingColor() {
return drawingColor;
}

public void setDrawingColor(Color newColor) {
if (newColor == null) {
throw new IllegalArgumentException("Drawing color cannot be null");
}
this.drawingColor = newColor;
}

private void initialize() {
addMouseListener(new MouseAdapter() {
int x1;
int y1;

@Override
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
currentLine = null;
}

@Override
public void mouseReleased(MouseEvent e) {
Line line = createLine(e, drawingColor);
lineList.add(line);
currentLine = null;
repaint();
}

@Override
public void mouseMoved(MouseEvent e) {
currentLine = createLine(e, Color.BLACK);
repaint();
}

private Line createLine(MouseEvent e, Color currentColor) {
int x2 = e.getX();
int y2 = e.getY();
return new Line(x1, x2, y1, y2, currentColor);
}
});
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Line line : lineList) {
line.draw(g);
System.out.println(line);
}

if (currentLine != null) {
currentLine.draw(g);
}
}

private static class Line {
private final int x1;
private final int x2;
private final int y1;
private final int y2;
private final Color color;

public Line(int x1, int x2, int y1, int y2, Color color) {
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
this.color = color;
}

public void draw(Graphics page) {
page.setColor(color); //!! This first!
page.drawLine(x1, y1, x2, y2); // **Then** this
}
}
}

主框架:

public class MainFrame extends javax.swing.JFrame {
private SketchPad pad;

public MainFrame() {
initComponents();
}

@SuppressWarnings("unchecked")
private void initComponents() {
pad = new SketchPad();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(pad, java.awt.BorderLayout.CENTER);

pack();
}
}

更新:需要一个 mouseMotionListener:

private void initialize() {
MouseAdapter adapter = new MouseAdapter() {
int x1;
int y1;

@Override
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
currentLine = null;
addMouseMotionListener(this);
}

@Override
public void mouseReleased(MouseEvent e) {
Line line = createLine(e, drawingColor);
lineList.add(line);
currentLine = null;
repaint();
removeMouseMotionListener(this);
}

@Override
public void mouseDragged(MouseEvent e) {
currentLine = createLine(e, Color.BLACK);
repaint();
}

private Line createLine(MouseEvent e, Color currentColor) {
int x2 = e.getX();
int y2 = e.getY();
return new Line(x1, x2, y1, y2, currentColor);
}
};
addMouseListener(adapter);
addMouseMotionListener(adapter);
}

更新2:处理启用/禁用

private final MouseAdapter adapter = new MouseAdapter() {
int x1;
int y1;

@Override
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
currentLine = null;
}

@Override
public void mouseReleased(MouseEvent e) {
Line line = createLine(e, drawingColor);
lineList.add(line);
currentLine = null;
repaint();
}

@Override
public void mouseDragged(MouseEvent e) {
currentLine = createLine(e, Color.BLACK);
repaint();
}

private Line createLine(MouseEvent e, Color currentColor) {
int x2 = e.getX();
int y2 = e.getY();
return new Line(x1, x2, y1, y2, currentColor);
}
};

...

private void initialize() {
setEnabled(isEnabled());
}

...

@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (enabled) {
addMouseListener(adapter);
addMouseMotionListener(adapter);
} else {
removeMouseListener(adapter);
removeMouseMotionListener(adapter);
}
}

关于java - PaintComponent(Graphics) 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636851/

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