使用 JColorChooser 绘图

Posted

技术标签:

【中文标题】使用 JColorChooser 绘图【英文标题】:Drawing with JColorChooser 【发布时间】:2019-06-27 01:43:01 【问题描述】:

我正在尝试使用颜色选择器来选择要绘制的颜色。我可以让它显示颜色选择并以黑色绘制,但之后我就卡住了。

package sketch;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
*
* @author Brittany
*/
public class Sketch extends JPanel

/**
 * Keeps track of the last point to draw the next line from.
 */
private Point lastPoint;

/**
 * Constructs a panel, registering listeners for the mouse.
 */
public Sketch() 

 Color drawColor = Color.BLACK;



    // When the mouse button goes down, set the current point
    // to the location at which the mouse was pressed.
    addMouseListener(new MouseAdapter() 
        @Override
        public void mousePressed(MouseEvent e) 
            lastPoint = new Point(e.getX(), e.getY());
        
    );

    // When the mouse is dragged, draw a line from the old point
    // to the new point and update the value of lastPoint to hold
    // the new current point.
    addMouseMotionListener(new MouseMotionAdapter() 
        @Override
        public void mouseDragged(MouseEvent e) 
            Graphics g = getGraphics();
            g.setColor(drawColor);
            g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
            lastPoint = new Point(e.getX(), e.getY());
            g.dispose();
        
    );

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
    JFrame frame = new JFrame("Simple Sketching Program");
    JButton colorBtn = new JButton("Color");

   colorBtn.addActionListener(new ActionListener()
       public void actionPerformed(ActionEvent e) 
 Color newColor = JColorChooser.showDialog(frame,"Choose Color",Color.BLACK);
            if(newColor != null)

            

        
    );



    frame.getContentPane().add(new Sketch(), BorderLayout.CENTER);
    frame.getContentPane().add(colorBtn, BorderLayout.NORTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);




【问题讨论】:

查看Custom Painting Approaches 获取基本示例以帮助您入门。该示例使用一个按钮来选择绘画颜色,因此您需要修改该逻辑以使用 JColorChooser。 【参考方案1】:

Graphics g = getGraphics(); 不是自定义绘画的工作方式。 getGraphics 可以返回 null 并且只不过是上一次绘制的快照,它将在下一次绘制时被替换。

首先查看Performing Custom Painting 和Painting in AWT and Swing,了解有关绘画的工作原理以及您应该如何使用它的更多详细信息。

然后你有两个选择。您可以使用BufferedImage 作为主要绘图表面,然后将其绘制到组件上,或者您可以跟踪绘制的内容(以及颜色)并在每次绘制周期发生时重现它。两者都有优点和缺点,您将使用哪种取决于您的需求。

回答你的问题。您需要某种方式将新颜色传递给Sketch 的实例。

我首先在Sketch 中创建一个setter,它可以用于其他类来改变颜色...

public Sketch() 

    private Color drawColor = Color.BLACK;

    public void setDrawColor(Color color) 
        if (color == null) 
            drawColor = Color.BLACK;
         else 
            drawColor = colorl
        
    

那你就用这个方法把新的颜色传给它...

public static void main(String[] args) 
    JFrame frame = new JFrame("Simple Sketching Program");
    JButton colorBtn = new JButton("Color");

    Sketch sketch = new Sketch();

    colorBtn.addActionListener(new ActionListener()
        public void actionPerformed(ActionEvent e) 
            Color newColor = JColorChooser.showDialog(frame,"Choose Color",Color.BLACK);
            if(newColor != null)
                sketch.setDrawColor(newColor);
            
        
    );


    frame.getContentPane().add(new Sketch(), BorderLayout.CENTER);

【讨论】:

以上是关于使用 JColorChooser 绘图的主要内容,如果未能解决你的问题,请参考以下文章

使用 JColorChooser 获取 Html 颜色代码

JColorChooser 中的异常行为(或可能的错误)

Java Swing JColorChooser 颜色 RGB 到 sRGB

如何从 JColorChooser 获取颜色窗格并在我自己的窗口中使用它?

更改 JColorChooser 的预览面板

仅 RGB 的 JColorChooser (Java 7)