绘画时关于Java绘图程序的多个问题

我有一个Java绘图程序,我有两个问题要处理它。 这两个问题都相对简单,只关注如何处理鼠标输入以及图像如何使用颜色。 这是应用程序的照片:

在此处输入图像描述

所以这是我的第一个问题:

正如您所看到的,从应用程序的外观来看,油漆区域上有一点点喷雾。 每个点都是鼠标点击。 用户按住鼠标按钮时程序无法识别,因此您必须单独单击。

这显然适得其反,用户不友好且不可接受。 现在,我如何解决这个问题,我不确定。 我尝试过使用永久while (true)循环,但这不起作用。 我如何制作它,以便不必每次都点击,每次按住鼠标时它会喷出点?

第二个问题是点的颜色。 如您所见,在底部有颜色按钮。 这些function,但有一个问题:每当我改变颜色时,屏幕上当前的所有点都会改变颜色。 颜色由名为currentColor的变量运行,该变量由由底部面板上的所有颜色按钮控制的actionListeners运行。 如何确保已经放置在屏幕上的颜色不再受影响?

我相信可以解决这两个问题的所有代码都在于我的自定义JPanel ,它用于程序绘制。 我将在下面发布整个课程,如果您有任何其他问题,请告诉我。

 int xCord, yCord; public class PaintPanel extends JPanel implements MouseListener { // default serial whatever... private static final long serialVersionUID = -6514297510194472060L; public PaintPanel() { addMouseListener(this); } ArrayList points = new ArrayList(); @Override public void paintComponent(Graphics g) { super.paintComponent(g); for (Point point : points) { g.setColor(currentColor); g.fillOval(point.x, point.y, 12, 12); } repaint(); } @Override public void mouseClicked(MouseEvent m) { } @Override public void mouseEntered(MouseEvent m) { } @Override public void mouseExited(MouseEvent m) { } @Override public void mousePressed(MouseEvent m) { if (paintPanel.contains(m.getPoint())) { points.add(m.getPoint()); xCord = m.getX(); yCord = m.getY(); System.out.println("x: " + xCord + " y: " + yCord); } } @Override public void mouseReleased(MouseEvent m) { } } 

Swing中的绘画具有破坏性。

也就是说,当Swing请求在组件上发生重绘时,该组件应该清除之前绘制的内容并更新自身。

颜色问题的问题在于您只能指定一种颜色。

一种可能的解决方案是绘制到后备缓冲区(如BufferedImage ),而不是依赖paintComponent

每次调用paintComponent ,您只需绘制BufferedImage而不是重新绘制所有点。

至于你的鼠标问题,你需要实现一个MouseMotionListener ,这将允许你检测鼠标拖过表面的时间,绘制一串点

使用非常基本的示例进行更新

在此处输入图像描述

 import java.awt.BorderLayout; 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.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class SimplePaint04 { public static void main(String[] args) { new SimplePaint04(); } public SimplePaint04() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private PaintPane paintPane; public TestPane() { setLayout(new BorderLayout()); add((paintPane = new PaintPane())); add(new ColorsPane(paintPane), BorderLayout.SOUTH); } } public class ColorsPane extends JPanel { public ColorsPane(PaintPane paintPane) { add(new JButton(new ColorAction(paintPane, "Red", Color.RED))); add(new JButton(new ColorAction(paintPane, "Green", Color.GREEN))); add(new JButton(new ColorAction(paintPane, "Blue", Color.BLUE))); } public class ColorAction extends AbstractAction { private PaintPane paintPane; private Color color; private ColorAction(PaintPane paintPane, String name, Color color) { putValue(NAME, name); this.paintPane = paintPane; this.color = color; } @Override public void actionPerformed(ActionEvent e) { paintPane.setForeground(color); } } } public class PaintPane extends JPanel { private BufferedImage background; public PaintPane() { setBackground(Color.WHITE); setForeground(Color.BLACK); MouseAdapter handler = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { drawDot(e.getPoint()); } @Override public void mouseDragged(MouseEvent e) { drawDot(e.getPoint()); } }; addMouseListener(handler); addMouseMotionListener(handler); } protected void drawDot(Point p) { if (background == null) { updateBuffer();; } if (background != null) { Graphics2D g2d = background.createGraphics(); g2d.setColor(getForeground()); g2d.fillOval(px - 5, py - 5, 10, 10); g2d.dispose(); } repaint(); } @Override public void invalidate() { super.invalidate(); updateBuffer(); } protected void updateBuffer() { if (getWidth() > 0 && getHeight() > 0) { BufferedImage newBuffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2d = newBuffer.createGraphics(); g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, getWidth(), getHeight()); if (background != null) { g2d.drawImage(background, 0, 0, this); } g2d.dispose(); background = newBuffer; } } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); if (background == null) { updateBuffer(); } g2d.drawImage(background, 0, 0, this); g2d.dispose(); } } }