如何在JAVA中设置运行时的笔触颜色?

我正在尝试创建一个界面,用户可以在其中更改线条的颜色以标记背景或图像的前景。 到目前为止,我已编码:

private class ImageLine extends JComponent { java.awt.Point p1,p2; BufferedImage show; ArrayList  shapes = new ArrayList(); int flag = 0; Color color = Color.ORANGE; public ImageLine(BufferedImage img) { show = img; setPreferredSize(new Dimension(img.getWidth(), img.getHeight())); this.addMouseListener ( new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { p1 = e.getPoint(); } @Override public void mouseReleased(MouseEvent e) { p2 = e.getPoint(); Shape r = createLine(p1.x,p1.y,e.getX(),e.getY()); shapes.add(r); repaint(); } @Override public void mouseDragged(MouseEvent e) { mouseReleased(e); repaint(); } } ); this.addKeyListener( new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if(e.getKeyChar() == 'b') { color = Color.GREEN; System.out.println("bck"); } if(e.getKeyChar() == 'f') { color = Color.RED; System.out.println("fgr"); } } } ); this.setFocusable(true); } private Line2D.Float createLine(int x1, int y1, int x2, int y2) { return new Line2D.Float(x1,y1 ,x2, y2); } 

直到这一部分一切正常,我真正的问题出现在我试图覆盖paintComponent()方法时,实际上我并不确切知道如何设置颜色,因为keylistener指示,在这种情况下,如果用户按下“b”键线的颜色必须变为绿色,另一方面,如果用户按“f”键,线的颜色必须变为红色,如果用户绘制不同的线,这些线必须保持显示。 我试过没有成功的代码:

 public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(10)); g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f)); for (Shape s : shapes) { //g2.setPaint(Color.BLACK); g2.draw(s); g2.setPaint(color); //g2.fill(s); } if (p1 != null && p2 != null) { g2.setPaint(Color.CYAN); Shape r = createLine(p1.x, p1.y, p2.x, p2.y); g2.draw(r); } } 

但结果不是我想要的,我绘制线条并改变颜色,但是当这种情况发生时,我画的线条会自动变换为所选择的颜色,并且它们不会保持它的“原始颜色”。 任何sugestions? 提前致谢。

有几种方法可以实现这一点,我有点像将ShapeColor结合在一起成为一个对象的想法,但是当你添加更多的形状时,这可能会带来更多的工作。

另一种解决方案可能是使用Map来简单地将线条映射到颜色

行

 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.Shape; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Line2D; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DrawLines { public static void main(String[] args) { new DrawLines(); } public DrawLines() { 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 TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private Line2D currentLine; private Map mapColors; private Color currentColor; private List shapes; public TestPane() { mapColors = new HashMap<>(25); shapes = new ArrayList<>(25); InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap actionMap = getActionMap(); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F, 0), "foreground"); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_B, 0), "background"); actionMap.put("foreground", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { currentColor = Color.GREEN; if (currentLine != null) { mapColors.put(currentLine, currentColor); repaint(); } } }); actionMap.put("background", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { currentColor = Color.RED; if (currentLine != null) { mapColors.put(currentLine, currentColor); repaint(); } } }); MouseAdapter ma = new MouseAdapter() { private Point p1, p2; @Override public void mousePressed(MouseEvent e) { p1 = e.getPoint(); currentLine = null; } @Override public void mouseReleased(MouseEvent e) { p2 = e.getPoint(); if (currentLine == null) { currentLine = createLine(p1.x, p1.y, e.getX(), e.getY()); } else { currentLine.setLine(p1, p2); } mapColors.put(currentLine, currentColor); shapes.add(currentLine); repaint(); } @Override public void mouseDragged(MouseEvent e) { p2 = e.getPoint(); if (currentLine == null) { currentLine = createLine(p1.x, p1.y, e.getX(), e.getY()); } else { currentLine.setLine(p1, p2); } repaint(); } private Line2D.Float createLine(int x1, int y1, int x2, int y2) { return new Line2D.Float(x1, y1, x2, y2); } }; addMouseListener(ma); addMouseMotionListener(ma); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); for (Shape shape : shapes) { Color color = mapColors.get(shape); if (color == null) { color = Color.BLACK; } g2d.setColor(color); g2d.draw(shape); } if (currentLine != null) { Color color = mapColors.get(currentLine); if (color == null) { color = currentColor; } g2d.setColor(color); g2d.draw(currentLine); } g2d.dispose(); } } } 

此外,我避免使用KeyListener并使用键绑定API,而不是麻烦

有关更多详细信息,请参见如何使用键绑定

查看自定义绘画方法 。

您可能希望使用DrawOnImage方法。 它使用ColoredRectangle类来存储颜色和Rectangle的信息。 然后在paintComponent()方法中循环遍历所有ColoredRectangle类并绘制Rectangle。

您需要添加逻辑以更改所选矩形的颜色。