Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在jframe(JAVA)上绘制渐变色对象后保存该对象_Java_Colors_Gradient - Fatal编程技术网

在jframe(JAVA)上绘制渐变色对象后保存该对象

在jframe(JAVA)上绘制渐变色对象后保存该对象,java,colors,gradient,Java,Colors,Gradient,好的,这是我的代码。 包mypanal /** * *@作者摩根 */ 但是我一辈子都想不出如何保存渐变色而不是纯色。 请帮忙。 谢谢 (如果您需要更好的解释,我可以上传一些图片)与其依赖字符串分析,不如实际定义可以绘制的对象及其属性 这意味着,当用户开始在曲面上绘制时,您需要创建一个新的“可绘制”对象,并使用它所需的属性为其种子,例如 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; imp

好的,这是我的代码。 包mypanal

/** * *@作者摩根 */

但是我一辈子都想不出如何保存渐变色而不是纯色。 请帮忙。 谢谢
(如果您需要更好的解释,我可以上传一些图片)

与其依赖
字符串分析,不如实际定义可以绘制的对象及其属性

这意味着,当用户开始在曲面上绘制时,您需要创建一个新的“可绘制”对象,并使用它所需的属性为其种子,例如

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();

        }

    }
}