我是Java的新手,我正在尝试制作一个简单的绘画程序,其中用户按下按钮以通过鼠标拖动来绘制线条
我的问题是尽管保存了每行的属性,但线条并未在画布上绘制。 当我尝试使用“鼠标释放”方法画线时,它可以工作,因此我认为问题出在“ 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);
}
}
}
答案 0 :(得分:1)
JFrame
并不能覆盖paintComponent
:它们是多层容器。如果要绘制自定义组件,请创建JComponent
(或JPanel
)的子类,然后将其放入JFrame
的(内容窗格)中。
这对我有用:
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);
}
}