在jframe(JAVA)上绘制渐变色对象后保存该对象
好的,这是我的代码。 包mypanal /** * *@作者摩根 */ 但是我一辈子都想不出如何保存渐变色而不是纯色。 请帮忙。 谢谢在jframe(JAVA)上绘制渐变色对象后保存该对象,java,colors,gradient,Java,Colors,Gradient,好的,这是我的代码。 包mypanal /** * *@作者摩根 */ 但是我一辈子都想不出如何保存渐变色而不是纯色。 请帮忙。 谢谢 (如果您需要更好的解释,我可以上传一些图片)与其依赖字符串分析,不如实际定义可以绘制的对象及其属性 这意味着,当用户开始在曲面上绘制时,您需要创建一个新的“可绘制”对象,并使用它所需的属性为其种子,例如 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; imp
(如果您需要更好的解释,我可以上传一些图片)与其依赖
字符串分析,不如实际定义可以绘制的对象及其属性
这意味着,当用户开始在曲面上绘制时,您需要创建一个新的“可绘制”对象,并使用它所需的属性为其种子,例如
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.LinearGradientPaint;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class MyPaint {
public static void main(String[] args) {
new MyPaint();
}
public MyPaint() {
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());
DrawablePane dp = new DrawablePane();
ControlPane cp = new ControlPane(dp);
frame.add(dp);
frame.add(cp, BorderLayout.WEST);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class State {
private final Color foreground;
private final Color background;
private final boolean gradient;
public State(Color foreground, Color background, boolean gradient) {
this.foreground = foreground;
this.background = background;
this.gradient = gradient;
}
public Color getBackground() {
return background;
}
public Color getForeground() {
return foreground;
}
public boolean isGradient() {
return gradient;
}
}
public class ControlPane extends JPanel {
private JComboBox shapes;
private JLabel foreground;
private JLabel background;
private JCheckBox gradient;
private DrawablePane drawablePane;
public ControlPane(DrawablePane pane) {
// I'd prefer to use some kind of factory, but this is just an example..
shapes = new JComboBox<>(new String[]{"Rectangle", "Oval"});
foreground = createColorLable(Color.BLACK);
foreground.setToolTipText("Foreground");
background = createColorLable(Color.WHITE);
background.setToolTipText("Background");
gradient = new JCheckBox("Gradient");
JPanel panel = new JPanel();
panel.add(foreground);
panel.add(background);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
add(shapes, gbc);
add(panel, gbc);
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;
add(gradient, gbc);
setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(12, 12, 12, 12)));
this.drawablePane = pane;
MouseHandler mouseHandler = new MouseHandler();
drawablePane.addMouseListener(mouseHandler);
drawablePane.addMouseMotionListener(mouseHandler);
}
protected Drawable createDrawable() {
Drawable drawable = null;
State state = new State(foreground.getBackground(), background.getBackground(), gradient.isSelected());
String selected = (String) shapes.getSelectedItem();
if ("rectangle".equalsIgnoreCase(selected)) {
drawable = new Square(state);
} else if ("oval".equalsIgnoreCase(selected)) {
drawable = new Circle(state);
}
return drawable;
}
protected JLabel createColorLable(Color base) {
final JLabel label = new JLabel();
label.setBackground(base);
label.setBorder(new LineBorder(Color.BLACK));
label.setPreferredSize(new Dimension(25, 25));
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
label.setOpaque(true);
label.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
Color color = JColorChooser.showDialog(label, "Color", label.getBackground());
if (color != null) {
label.setBackground(color);
}
}
});
return label;
}
public class MouseHandler extends MouseAdapter {
private Drawable drawable;
private Point clickPoint;
@Override
public void mousePressed(MouseEvent e) {
drawable = createDrawable();
drawable.setLocation(e.getPoint());
drawablePane.addDrawable(drawable);
clickPoint = e.getPoint();
}
@Override
public void mouseDragged(MouseEvent e) {
Point drag = e.getPoint();
Point start = clickPoint;
int maxX = Math.max(drag.x, start.x);
int maxY = Math.max(drag.y, start.y);
int minX = Math.min(drag.x, start.x);
int minY = Math.min(drag.y, start.y);
int width = maxX - minX;
int height = maxY - minY;
drawable.setLocation(new Point(minX, minY));
drawable.setSize(new Dimension(width, height));
drawablePane.repaint();
}
}
}
public interface Drawable {
public void paint(JComponent parent, Graphics2D g2d);
public void setLocation(Point location);
public void setSize(Dimension size);
public State getState();
public Rectangle getBounds();
}
public abstract class AbstractDrawable implements Drawable {
private Rectangle bounds;
private State state;
public AbstractDrawable(State state) {
bounds = new Rectangle();
this.state = state;
}
@Override
public State getState() {
return state;
}
public abstract Shape getShape();
@Override
public void setLocation(Point location) {
bounds.setLocation(location);
}
@Override
public void setSize(Dimension size) {
bounds.setSize(size);
}
@Override
public Rectangle getBounds() {
return bounds;
}
@Override
public void paint(JComponent parent, Graphics2D g2d) {
Shape shape = getShape();
State state = getState();
Rectangle bounds = getBounds();
if (state.isGradient()) {
if (bounds.width > 0 && bounds.height > 0) {
Point2D startPoint = new Point2D.Double(bounds.x, bounds.y);
Point2D endPoint = new Point2D.Double(bounds.x + bounds.width, bounds.y + bounds.height);
LinearGradientPaint gp = new LinearGradientPaint(
startPoint,
endPoint,
new float[]{0f, 1f},
new Color[]{state.getForeground(), state.getBackground()});
g2d.setPaint(gp);
g2d.fill(shape);
}
} else {
g2d.setPaint(state.getBackground());
g2d.fill(shape);
g2d.setPaint(state.getForeground());
g2d.draw(shape);
}
}
}
public class Square extends AbstractDrawable {
public Square(State state) {
super(state);
}
@Override
public Shape getShape() {
return getBounds();
}
}
public class Circle extends AbstractDrawable {
public Circle(State state) {
super(state);
}
@Override
public Shape getShape() {
Rectangle bounds = getBounds();
return new Ellipse2D.Float(bounds.x, bounds.y, bounds.width, bounds.height);
}
}
public class DrawablePane extends JPanel {
private List<Drawable> itemsDrawn;
public DrawablePane() {
itemsDrawn = new ArrayList<>();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Drawable d : itemsDrawn) {
d.paint(this, g2d);
}
g2d.dispose();
}
public void addDrawable(Drawable drawable) {
itemsDrawn.add(drawable);
repaint();
}
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Cursor;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.LinearGradientPaint;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.Shape;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.Ellipse2D;
导入java.awt.geom.Point2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JCheckBox;
导入javax.swing.JColorChooser;
导入javax.swing.JComboBox;
导入javax.swing.JComponent;
导入javax.swing.JFileChooser;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.CompoundBorder;
导入javax.swing.border.EmptyBorder;
导入javax.swing.border.LineBorder;
公共级MyPaint{
公共静态void main(字符串[]args){
新MyPaint();
}
公共油漆(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
DrawablePane dp=新的DrawablePane();
ControlPane cp=新的ControlPane(dp);
帧。添加(dp);
框架。添加(cp,边界布局。西部);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共阶级国家{
私有最终颜色前景;
私人最终颜色背景;
私有最终布尔梯度;
公共状态(彩色前景、彩色背景、布尔渐变){
this.foreground=前景;
this.background=背景;
这个梯度=梯度;
}
公共颜色getBackground(){
返回背景;
}
公共颜色getForeground(){
返回前景;
}
公共布尔梯度(){
回归梯度;
}
}
公共类控制面板扩展了JPanel{
私有JComboBox形状;
私有JLabel前景;
私人背景;
私有JCheckBox梯度;
私人可提取窗格玻璃可提取窗格玻璃;
公共控制窗格(可绘制窗格){
//我宁愿使用某种工厂,但这只是一个例子。。
shapes=newjcombobox(新字符串[]{“矩形”、“椭圆形”});
前景=createColorLable(Color.BLACK);
前台。setToolTipText(“前台”);
背景=createColorLable(Color.WHITE);
background.setToolTiptText(“背景”);
梯度=新的JCheckBox(“梯度”);
JPanel面板=新的JPanel();
面板。添加(前景);
面板。添加(背景);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.weightx=1;
添加(形状、gbc);
添加(面板,gbc);
gbc.weighty=1;
gbc.anchor=gridbag.NORTH;
添加(梯度,gbc);
setboorder(新的复合边框(新的线边框(颜色为黑色),新的空边框(12,12,12,12));
this.drawablePane=窗格;
MouseHandler MouseHandler=新的MouseHandler();
可拉伸窗格玻璃。添加鼠标定位器(鼠标手柄);
drawablePane.addMouseMotionListener(mouseHandler);
}
受保护的可绘制createDrawable(){
Drawable Drawable=null;
State State=新状态(foreground.getBackground()、background.getBackground()、gradient.isSelected());
选定字符串=(字符串)形状。getSelectedItem();
如果(“矩形”。相等信号案例(选定)){
可绘制=新正方形(状态);
}else if(“椭圆形”。等效信号案例(选定)){
可绘制=新圆(状态);
}
回拉;
}
受保护的JLabel createColorLable(颜色基){
最终JLabel标签=新的JLabel();
标签.立根台(底座);
label.setboorder(新线条边框(颜色为黑色));
标签。设置首选尺寸(新尺寸(25,25));
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_Cursor));
label.set不透明(true);
label.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
Color Color=JColorChooser.showDialog(label,“Color”,label.getBackground());
如果(颜色!=null){
if (start != null && end != null) {
itemsDrawn.add(shape + " " + color + " " + start.x + " " + start.y
+ " " + end.x + " " + end.y + " " + fillBox.isSelected());
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.LinearGradientPaint;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class MyPaint {
public static void main(String[] args) {
new MyPaint();
}
public MyPaint() {
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());
DrawablePane dp = new DrawablePane();
ControlPane cp = new ControlPane(dp);
frame.add(dp);
frame.add(cp, BorderLayout.WEST);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class State {
private final Color foreground;
private final Color background;
private final boolean gradient;
public State(Color foreground, Color background, boolean gradient) {
this.foreground = foreground;
this.background = background;
this.gradient = gradient;
}
public Color getBackground() {
return background;
}
public Color getForeground() {
return foreground;
}
public boolean isGradient() {
return gradient;
}
}
public class ControlPane extends JPanel {
private JComboBox shapes;
private JLabel foreground;
private JLabel background;
private JCheckBox gradient;
private DrawablePane drawablePane;
public ControlPane(DrawablePane pane) {
// I'd prefer to use some kind of factory, but this is just an example..
shapes = new JComboBox<>(new String[]{"Rectangle", "Oval"});
foreground = createColorLable(Color.BLACK);
foreground.setToolTipText("Foreground");
background = createColorLable(Color.WHITE);
background.setToolTipText("Background");
gradient = new JCheckBox("Gradient");
JPanel panel = new JPanel();
panel.add(foreground);
panel.add(background);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
add(shapes, gbc);
add(panel, gbc);
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;
add(gradient, gbc);
setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(12, 12, 12, 12)));
this.drawablePane = pane;
MouseHandler mouseHandler = new MouseHandler();
drawablePane.addMouseListener(mouseHandler);
drawablePane.addMouseMotionListener(mouseHandler);
}
protected Drawable createDrawable() {
Drawable drawable = null;
State state = new State(foreground.getBackground(), background.getBackground(), gradient.isSelected());
String selected = (String) shapes.getSelectedItem();
if ("rectangle".equalsIgnoreCase(selected)) {
drawable = new Square(state);
} else if ("oval".equalsIgnoreCase(selected)) {
drawable = new Circle(state);
}
return drawable;
}
protected JLabel createColorLable(Color base) {
final JLabel label = new JLabel();
label.setBackground(base);
label.setBorder(new LineBorder(Color.BLACK));
label.setPreferredSize(new Dimension(25, 25));
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
label.setOpaque(true);
label.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
Color color = JColorChooser.showDialog(label, "Color", label.getBackground());
if (color != null) {
label.setBackground(color);
}
}
});
return label;
}
public class MouseHandler extends MouseAdapter {
private Drawable drawable;
private Point clickPoint;
@Override
public void mousePressed(MouseEvent e) {
drawable = createDrawable();
drawable.setLocation(e.getPoint());
drawablePane.addDrawable(drawable);
clickPoint = e.getPoint();
}
@Override
public void mouseDragged(MouseEvent e) {
Point drag = e.getPoint();
Point start = clickPoint;
int maxX = Math.max(drag.x, start.x);
int maxY = Math.max(drag.y, start.y);
int minX = Math.min(drag.x, start.x);
int minY = Math.min(drag.y, start.y);
int width = maxX - minX;
int height = maxY - minY;
drawable.setLocation(new Point(minX, minY));
drawable.setSize(new Dimension(width, height));
drawablePane.repaint();
}
}
}
public interface Drawable {
public void paint(JComponent parent, Graphics2D g2d);
public void setLocation(Point location);
public void setSize(Dimension size);
public State getState();
public Rectangle getBounds();
}
public abstract class AbstractDrawable implements Drawable {
private Rectangle bounds;
private State state;
public AbstractDrawable(State state) {
bounds = new Rectangle();
this.state = state;
}
@Override
public State getState() {
return state;
}
public abstract Shape getShape();
@Override
public void setLocation(Point location) {
bounds.setLocation(location);
}
@Override
public void setSize(Dimension size) {
bounds.setSize(size);
}
@Override
public Rectangle getBounds() {
return bounds;
}
@Override
public void paint(JComponent parent, Graphics2D g2d) {
Shape shape = getShape();
State state = getState();
Rectangle bounds = getBounds();
if (state.isGradient()) {
if (bounds.width > 0 && bounds.height > 0) {
Point2D startPoint = new Point2D.Double(bounds.x, bounds.y);
Point2D endPoint = new Point2D.Double(bounds.x + bounds.width, bounds.y + bounds.height);
LinearGradientPaint gp = new LinearGradientPaint(
startPoint,
endPoint,
new float[]{0f, 1f},
new Color[]{state.getForeground(), state.getBackground()});
g2d.setPaint(gp);
g2d.fill(shape);
}
} else {
g2d.setPaint(state.getBackground());
g2d.fill(shape);
g2d.setPaint(state.getForeground());
g2d.draw(shape);
}
}
}
public class Square extends AbstractDrawable {
public Square(State state) {
super(state);
}
@Override
public Shape getShape() {
return getBounds();
}
}
public class Circle extends AbstractDrawable {
public Circle(State state) {
super(state);
}
@Override
public Shape getShape() {
Rectangle bounds = getBounds();
return new Ellipse2D.Float(bounds.x, bounds.y, bounds.width, bounds.height);
}
}
public class DrawablePane extends JPanel {
private List<Drawable> itemsDrawn;
public DrawablePane() {
itemsDrawn = new ArrayList<>();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Drawable d : itemsDrawn) {
d.paint(this, g2d);
}
g2d.dispose();
}
public void addDrawable(Drawable drawable) {
itemsDrawn.add(drawable);
repaint();
}
}
}