Рисование с помощью JColorChooser
Я пытаюсь использовать средство выбора цвета, чтобы выбрать цвет для рисования. Я могу заставить его отображать выбор цвета и рисовать черным, но я застрял после этого.
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);
}
}
1 ответ
Graphics g = getGraphics();
НЕ так, как работает обычай рисовать. getGraphics
может вернуться null
и является не более чем снимком предыдущего прохода рисования, который будет заменен на следующем проходе рисования.
Начните с изучения Выполнения пользовательской живописи и рисования в AWT и Swing для получения более подробной информации о том, как рисовать и как вы должны с ней работать.
Тогда у вас есть два варианта. Вы можете использовать BufferedImage
в качестве основной поверхности для рисования, а затем закрасьте ее для компонента, или вы можете отслеживать, что было нарисовано (и каким цветом), и воспроизводить его каждый раз, когда происходит цикл рисования. Оба имеют плюсы и минусы, и то, что вы будете использовать, будет зависеть от ваших потребностей.
Ответить на ваш вопрос. Вам нужно каким-то образом передать новый цвет экземпляру Sketch
,
Я бы начал с создания сеттера в Sketch
которые могут быть использованы для других классов, чтобы изменить цвет...
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);