@634

JFC の おえかき。

Advertisement

Swing + Java2D

追加機能。
  • テクスチャ描画
  • グラデーション描画
  • 描画補助色選択
  • 背景色選択
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;

public class JfcPaint{
    public static void main(String[] args){
        MyFrame mf = new MyFrame();
        mf.setTitle("ペイント");
        mf.setSize(400, 400);
        mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mf.show();
    }
}

class MyFrame extends JFrame implements ActionListener{
    private JMenuBar menuBar = new JMenuBar();
    private JMenu file;
    private JMenu edit;
    private JMenu conf;
    private JMenu help;
    private JMenu figure;
    private JMenu line;
    private JMenu landf;
    private JMenuItem open;
    private JMenuItem save;
    private JMenuItem quit;
    private JMenuItem clear;
    private JRadioButtonMenuItem fig_free;
    private JRadioButtonMenuItem fig_line;
    private JRadioButtonMenuItem fig_rect;
    private JRadioButtonMenuItem fig_elli;
    private JRadioButtonMenuItem fig_frec;
    private JRadioButtonMenuItem fig_fell;
    private JRadioButtonMenuItem fig_gra_fline;
    private JRadioButtonMenuItem fig_gra_frec;
    private JRadioButtonMenuItem fig_gra_fell;
    private JRadioButtonMenuItem fig_gra_free;
    private JRadioButtonMenuItem fig_tex_fline;
    private JRadioButtonMenuItem fig_tex_frec;
    private JRadioButtonMenuItem fig_tex_fell;
    private JRadioButtonMenuItem fig_tex_free;
    private ButtonGroup figGroup;
    private JRadioButtonMenuItem line_size1;
    private JRadioButtonMenuItem line_size2;
    private JRadioButtonMenuItem line_size3;
    private JRadioButtonMenuItem line_size4;
    private JRadioButtonMenuItem line_size5;
    private JRadioButtonMenuItem line_size6;
    private JRadioButtonMenuItem line_size7;
    private JRadioButtonMenuItem line_size8;
    private JRadioButtonMenuItem line_size9;
    private JRadioButtonMenuItem line_size10;
    private ButtonGroup sizeGroup;
    private JMenuItem color;
    private JMenuItem color2;
    private JMenuItem backcolor;
    private JMenuItem ver;
    private JRadioButtonMenuItem motif;
    private JRadioButtonMenuItem windows;
    private JRadioButtonMenuItem metal;
    private ButtonGroup lfGroup;
    private JCheckBoxMenuItem antialias;
    private JColorChooser colorChooser;
    private JFileChooser fileChooser;
    private MyPanel panel;

    public MyFrame(){
        panel = new MyPanel();
        getContentPane().add(panel);

        setJMenuBar(createMenu());
    }

    private JMenuBar createMenu(){
        menuBar = new JMenuBar();
        file   = new JMenu("ファイル");
        edit   = new JMenu("編集");
        conf   = new JMenu("設定");
        help   = new JMenu("ヘルプ");
        figure = new JMenu("図形");
        line   = new JMenu("線の太さ");
        landf  = new JMenu("Look & Feel");
        open  = new JMenuItem("開く");
        save  = new JMenuItem("保存");
        quit  = new JMenuItem("終了");
        color = new JMenuItem("描画色の選択");
        color2 = new JMenuItem("補助色の選択");
        backcolor = new JMenuItem("背景色の選択");
        clear = new JMenuItem("画面消去");
        ver   = new JMenuItem("バージョン情報");
        metal   = new JRadioButtonMenuItem("metal", true);
        motif   = new JRadioButtonMenuItem("motif");
        windows = new JRadioButtonMenuItem("windows");
        lfGroup = new ButtonGroup();
        fig_free = new JRadioButtonMenuItem("自由曲線", true);
        fig_line = new JRadioButtonMenuItem("直線");
        fig_rect = new JRadioButtonMenuItem("矩形");
        fig_elli = new JRadioButtonMenuItem("楕円");
        fig_frec = new JRadioButtonMenuItem("矩形(塗りつぶし)");
        fig_fell = new JRadioButtonMenuItem("楕円(塗りつぶし)");
        fig_gra_fline = new JRadioButtonMenuItem("直線(グラデーション)");
        fig_gra_frec = new JRadioButtonMenuItem("矩形(グラデーション)");
        fig_gra_fell = new JRadioButtonMenuItem("楕円(グラデーション)");
        fig_gra_free = new JRadioButtonMenuItem("自由曲線(グラデーション)");
        fig_tex_fline = new JRadioButtonMenuItem("直線(テクスチャ)");
        fig_tex_frec = new JRadioButtonMenuItem("矩形(テクスチャ)");
        fig_tex_fell = new JRadioButtonMenuItem("楕円(テクスチャ)");
        fig_tex_free = new JRadioButtonMenuItem("自由曲線(テクスチャ)");
        figGroup = new ButtonGroup();
        line_size1  = new JRadioButtonMenuItem(" 1 px", true);
        line_size2  = new JRadioButtonMenuItem(" 2 px");
        line_size3  = new JRadioButtonMenuItem(" 3 px");
        line_size4  = new JRadioButtonMenuItem(" 4 px");
        line_size5  = new JRadioButtonMenuItem(" 5 px");
        line_size6  = new JRadioButtonMenuItem(" 6 px");
        line_size7  = new JRadioButtonMenuItem(" 7 px");
        line_size8  = new JRadioButtonMenuItem(" 8 px");
        line_size9  = new JRadioButtonMenuItem(" 9 px");
        line_size10 = new JRadioButtonMenuItem("10 px");
        sizeGroup = new ButtonGroup();
        antialias = new JCheckBoxMenuItem("アンチエイリアス", false);

        open.addActionListener(this);
        save.addActionListener(this);
        quit.addActionListener(this);
        color.addActionListener(this);
        color2.addActionListener(this);
        backcolor.addActionListener(this);
        antialias.addActionListener(this);
        clear.addActionListener(this);
        fig_free.addActionListener(this);
        fig_line.addActionListener(this);
        fig_rect.addActionListener(this);
        fig_elli.addActionListener(this);
        fig_frec.addActionListener(this);
        fig_fell.addActionListener(this);
        fig_gra_fline.addActionListener(this);
        fig_gra_frec.addActionListener(this);
        fig_gra_fell.addActionListener(this);
        fig_gra_free.addActionListener(this);
        fig_tex_fline.addActionListener(this);
        fig_tex_frec.addActionListener(this);
        fig_tex_fell.addActionListener(this);
        fig_tex_free.addActionListener(this);
        line_size1.addActionListener(this);
        line_size2.addActionListener(this);
        line_size3.addActionListener(this);
        line_size4.addActionListener(this);
        line_size5.addActionListener(this);
        line_size6.addActionListener(this);
        line_size7.addActionListener(this);
        line_size8.addActionListener(this);
        line_size9.addActionListener(this);
        line_size10.addActionListener(this);
        ver.addActionListener(this);
        metal.addActionListener(this);
        motif.addActionListener(this);
        windows.addActionListener(this);

        file.add(open);
        file.add(save);
        file.add(new JSeparator());
        file.add(quit);
        edit.add(clear);
        figGroup.add(fig_free);
        figGroup.add(fig_line);
        figGroup.add(fig_rect);
        figGroup.add(fig_elli);
        figGroup.add(fig_frec);
        figGroup.add(fig_fell);
        figGroup.add(fig_gra_fline);
        figGroup.add(fig_gra_frec);
        figGroup.add(fig_gra_fell);
        figGroup.add(fig_gra_free);
        figGroup.add(fig_tex_fline);
        figGroup.add(fig_tex_frec);
        figGroup.add(fig_tex_fell);
        figGroup.add(fig_tex_free);
        figure.add(fig_free);
        figure.add(fig_line);
        figure.add(fig_rect);
        figure.add(fig_elli);
        figure.add(fig_frec);
        figure.add(fig_fell);
        figure.add(fig_gra_fline);
        figure.add(fig_gra_frec);
        figure.add(fig_gra_fell);
        figure.add(fig_gra_free);
        figure.add(fig_tex_fline);
        figure.add(fig_tex_frec);
        figure.add(fig_tex_fell);
        figure.add(fig_tex_free);
        sizeGroup.add(line_size1);
        sizeGroup.add(line_size2);
        sizeGroup.add(line_size3);
        sizeGroup.add(line_size4);
        sizeGroup.add(line_size5);
        sizeGroup.add(line_size6);
        sizeGroup.add(line_size7);
        sizeGroup.add(line_size8);
        sizeGroup.add(line_size9);
        sizeGroup.add(line_size10);
        line.add(line_size1);
        line.add(line_size2);
        line.add(line_size3);
        line.add(line_size4);
        line.add(line_size5);
        line.add(line_size6);
        line.add(line_size7);
        line.add(line_size8);
        line.add(line_size9);
        line.add(line_size10);
        conf.add(figure);
        conf.add(line);
        conf.add(new JSeparator());
        conf.add(color);
        conf.add(color2);
        conf.add(backcolor);
        conf.add(new JSeparator());
        conf.add(antialias);
        help.add(ver);
        lfGroup.add(metal);
        lfGroup.add(motif);
        lfGroup.add(windows);
        landf.add(metal);
        landf.add(motif);
        landf.add(windows);
        help.add(landf);
        menuBar.add(file);
        menuBar.add(edit);
        menuBar.add(conf);
        menuBar.add(help);

        return menuBar;
    }

    private void savePicture(){
        if(fileChooser == null){
            fileChooser = new JFileChooser();
        }

        try{
            int returnVal = fileChooser.showSaveDialog(this);
            if(returnVal == JFileChooser.APPROVE_OPTION){
                File file = fileChooser.getSelectedFile();
                FileOutputStream fos = new FileOutputStream(file);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(panel.getVector());
                oos.close();
                fos.close();
            }
        }catch(IOException ioe){
            System.err.println(ioe);
        }
    }

    private void openPicture(){
        if(fileChooser == null){
            fileChooser = new JFileChooser();
        }

        try{
            int returnVal = fileChooser.showOpenDialog(this);
            if(returnVal == JFileChooser.APPROVE_OPTION){
                File file = fileChooser.getSelectedFile();
                FileInputStream fis = new FileInputStream(file);
                ObjectInputStream ois = new ObjectInputStream(fis);
                panel.setVector((Vector)ois.readObject());
                ois.close();
                fis.close();
                panel.repaint();
            }
        }catch(IOException ioe){
            System.err.println(ioe);
        }catch(ClassNotFoundException cnfe){
            System.err.println(cnfe);
        }
    }

    private void chooseColor(){
        if(colorChooser == null){
            colorChooser = new JColorChooser();
        }
        panel.setColor(colorChooser.showDialog(
            this, "描画色選択", panel.getColor()));
    }

    private void chooseColor2(){
        if(colorChooser == null){
            colorChooser = new JColorChooser();
        }
        panel.setColor2(colorChooser.showDialog(
            this, "補助色選択", panel.getColor2()));
    }

    private void chooseBackColor(){
        Vector temp = panel.getVector();

        if(colorChooser == null){
            colorChooser = new JColorChooser();
        }

        panel.setBackground(colorChooser.showDialog(
            this, "背景色選択", panel.getBackground()));
    }

    public void actionPerformed(ActionEvent e){
        //ファイルメニュー
        if(e.getSource().equals(open)){
            openPicture();
        }else if(e.getSource().equals(save)){
            savePicture();
        }else if(e.getSource().equals(quit)){
            System.exit(0);
        }

        //編集メニュー
        if(e.getSource().equals(clear)){
            panel.setVector(new Vector());
            panel.repaint();
        }

        //設定メニュー
        if(e.getSource().equals(fig_line)){
            panel.setFigureFlag(0);
        }else if(e.getSource().equals(fig_rect)){
            panel.setFigureFlag(1);
        }else if(e.getSource().equals(fig_elli)){
            panel.setFigureFlag(2);
        }else if(e.getSource().equals(fig_frec)){
            panel.setFigureFlag(3);
        }else if(e.getSource().equals(fig_fell)){
            panel.setFigureFlag(4);
        }else if(e.getSource().equals(fig_free)){
            panel.setFigureFlag(5);
        }else if(e.getSource().equals(fig_gra_fline)){
            panel.setFigureFlag(6);
        }else if(e.getSource().equals(fig_gra_frec)){
            panel.setFigureFlag(7);
        }else if(e.getSource().equals(fig_gra_fell)){
            panel.setFigureFlag(8);
        }else if(e.getSource().equals(fig_gra_free)){
            panel.setFigureFlag(9);
        }else if(e.getSource().equals(fig_tex_fline)){
            panel.setFigureFlag(10);
        }else if(e.getSource().equals(fig_tex_frec)){
            panel.setFigureFlag(11);
        }else if(e.getSource().equals(fig_tex_fell)){
            panel.setFigureFlag(12);
        }else if(e.getSource().equals(fig_tex_free)){
            panel.setFigureFlag(13);
        }else if(e.getSource().equals(antialias)){
            panel.setAntialias(!panel.getAntialias());
            panel.repaint();
        }else if(e.getSource().equals(color)){
            chooseColor();
        }else if(e.getSource().equals(color2)){
            chooseColor2();
        }else if(e.getSource().equals(backcolor)){
            chooseBackColor();
        }else if(e.getSource().equals(line_size1)){
            panel.setLineSize(1);
        }else if(e.getSource().equals(line_size2)){
            panel.setLineSize(2);
        }else if(e.getSource().equals(line_size3)){
            panel.setLineSize(3);
        }else if(e.getSource().equals(line_size4)){
            panel.setLineSize(4);
        }else if(e.getSource().equals(line_size5)){
            panel.setLineSize(5);
        }else if(e.getSource().equals(line_size6)){
            panel.setLineSize(6);
        }else if(e.getSource().equals(line_size7)){
            panel.setLineSize(7);
        }else if(e.getSource().equals(line_size8)){
            panel.setLineSize(8);
        }else if(e.getSource().equals(line_size9)){
            panel.setLineSize(9);
        }else if(e.getSource().equals(line_size10)){
            panel.setLineSize(10);
        }

        //ヘルプメニュー
        if(e.getSource().equals(ver)){
            JOptionPane.showMessageDialog(getContentPane(), "おえかき\nバージョン 1.0");
        }else if(e.getSource().equals(metal)){
            try{
                UIManager.setLookAndFeel(
                    "javax.swing.plaf.metal.MetalLookAndFeel");
                SwingUtilities.updateComponentTreeUI(this);
            }catch(Exception ex){
                System.out.println("Error L&F Setting");
            }
        }else if(e.getSource().equals(motif)){
            try{
                UIManager.setLookAndFeel(
                    "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                SwingUtilities.updateComponentTreeUI(this);
            }catch(Exception ex){
                System.out.println("Error L&F Setting");
            }
        }else if(e.getSource().equals(windows)){
            try{
                UIManager.setLookAndFeel(
                    "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                SwingUtilities.updateComponentTreeUI(this);
            }catch(Exception ex){
                System.out.println("Error L&F Setting");
            }
        }
    }
}

class MyPanel extends JPanel implements MouseMotionListener, MouseListener{
    private float x;
    private float y;
    private float ex;
    private float ey;
    private int figureFlag;
    private boolean dragFlag;
    private boolean antialiasFlag;
    private Color col;
    private Color col2;
    private float size;
    private BufferedImage image;
    private Vector pictureData = new Vector();

    public MyPanel(){
        col = Color.black;
        col2 = Color.cyan;
        antialiasFlag = false;
        dragFlag = false;
        figureFlag = 5;
        size = 1.0f;

        try{
            image = ImageIO.read(new File("./sample.jpg"));
        }catch(Exception e){
            System.out.println("IOError");
            System.exit(-1);
        }

        setBackground(Color.white);
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public void setLineSize(float f){
        size = f;
    }

    public float getLineSize(){
        return size;
    }

    public void setAntialias(boolean b){
        antialiasFlag = b;
    }

    public boolean getAntialias(){
        return antialiasFlag;
    }

    public void setFigureFlag(int n){
        figureFlag = n;
    }

    public int getFigureFlag(){
        return figureFlag;
    }

    public void setColor(Color c){
        col = c;
    }

    public Color getColor(){
        return col;
    }

    public void setColor2(Color c){
        col2 = c;
    }

    public Color getColor2(){
        return col2;
    }

    public void setVector(Vector v){
        pictureData = v;
    }

    public Vector getVector(){
        return pictureData;
    }

    public void paint(Graphics g){
        super.paint(g);

        //情報
        g.setColor(col2);
        g.fillRect(0, 0, 10, 10);
        g.setColor(Color.black);
        g.drawRect(0, 0, 10, 10);
        g.setColor(col);
        g.fillRect(5, 5, 10, 10);
        g.setColor(Color.black);
        g.drawRect(5, 5, 10, 10);

        g.drawImage((Image)image, 30, 0, 20, 20, this);//ImageObserver observer)
        //情報ここまで

        Graphics2D g2 = (Graphics2D)g;

        if(antialiasFlag){
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        }

        for(int i = 0; i < pictureData.size(); i++){
            ((Figure)pictureData.elementAt(i)).Draw(g2);
        }

        if(dragFlag){
            g2.setColor(col);
            if(figureFlag == 0){
                g2.setStroke(new BasicStroke(size));
                g2.draw(new Line2D.Double(x, y, ex, ey));
            }else if(figureFlag == 1){
                g2.setStroke(new BasicStroke(size));
                g2.draw(new Rectangle2D.Double(
                    x<ex?x:ex, y<ey?y:ey,Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 2){
                g2.setStroke(new BasicStroke(size));
                g2.draw(new Ellipse2D.Double(
                    x<ex?x:ex, y<ey?y:ey,Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 3){
                g2.setStroke(new BasicStroke(size));
                g2.fill(new Rectangle2D.Double(
                    x<ex?x:ex, y<ey?y:ey,Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 4){
                g2.setStroke(new BasicStroke(size));
                g2.fill(new Ellipse2D.Double(
                    x<ex?x:ex, y<ey?y:ey,Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 6){
                g2.setColor(col);
                g2.setStroke(new BasicStroke(size));
                g2.setPaint(new GradientPaint(x, y, col, ex, ey, col2, true));
                g2.draw(new Line2D.Double(x, y, ex, ey));
            }else if(figureFlag == 7){
                g2.setStroke(new BasicStroke(size));
                g2.setPaint(new GradientPaint(x<ex?x:ex, y<ey?y:ey,
                    col, Math.abs(x-ex), Math.abs(y-ey), col2, true));
                g2.fill(new Rectangle2D.Double(
                    x<ex?x:ex, y<ey?y:ey,Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 8){
                g2.setStroke(new BasicStroke(size));
                g2.setPaint(new GradientPaint(x<ex?x:ex, y<ey?y:ey,
                    col, Math.abs(x-ex), Math.abs(y-ey), col2, true));
                g2.fill(new Ellipse2D.Double(
                    x<ex?x:ex, y<ey?y:ey,Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 10){
                g2.setStroke(new BasicStroke(size));
                   g2.setPaint(new TexturePaint(image, new Rectangle2D.Double(
                       0, 0, image.getWidth(), image.getHeight())));
                g2.draw(new Line2D.Double(x, y, ex, ey));
            }else if(figureFlag == 11){
                g2.setStroke(new BasicStroke(size));
                   g2.setPaint(new TexturePaint(image, new Rectangle2D.Double(
                       0, 0, image.getWidth(), image.getHeight())));
                g2.fill(new Rectangle2D.Double(
                    x<ex?x:ex, y<ey?y:ey, Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 12){
                g2.setStroke(new BasicStroke(size));
                   g2.setPaint(new TexturePaint(image, new Rectangle2D.Double(
                       0, 0, image.getWidth(), image.getHeight())));
                g2.fill(new Ellipse2D.Double(
                    x<ex?x:ex, y<ey?y:ey, Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 14){
                g2.setColor(getBackground());
                g2.fill(new Rectangle2D.Double(
                    x<ex?x:ex, y<ey?y:ey, Math.abs(x-ex), Math.abs(y-ey)));
            }else if(figureFlag == 15){
                g2.setColor(getBackground());
                g2.fill(new Ellipse2D.Double(
                    x<ex?x:ex, y<ey?y:ey, Math.abs(x-ex), Math.abs(y-ey)));
            }
        }
    }

    public void mouseDragged(MouseEvent e){
        ex = e.getX();
        ey = e.getY();

        if(figureFlag == 5){
            ((FreeLineData)pictureData.elementAt(
                pictureData.size()-1)).addPoint(x, y, ex, ey);
            x = ex;
            y = ey;
        }else if(figureFlag == 9){
            ((GradientFreeLineData)pictureData.elementAt(
                pictureData.size()-1)).addPoint(x, y, ex, ey);
            x = ex;
            y = ey;
        }else if(figureFlag == 13){
            ((TextureFreeLineData)pictureData.elementAt(
                pictureData.size()-1)).addPoint(x, y, ex, ey);
            x = ex;
            y = ey;
        }
        repaint();
    }

    public void mousePressed(MouseEvent e){
        x = e.getX();
        y = e.getY();
        dragFlag = true;

        if(figureFlag == 5){
            pictureData.addElement(new FreeLineData(col, size));
        }else if(figureFlag == 9){
            pictureData.addElement(new GradientFreeLineData(col, size, col2));
        }else if(figureFlag == 13){
            pictureData.addElement(new TextureFreeLineData(col, size, image));
        }
    }

    public void mouseReleased(MouseEvent e){
        dragFlag = false;

        if(figureFlag == 0){
            pictureData.addElement(
                new LineData(x, y, e.getX(), e.getY(), col, size));
        }else if(figureFlag == 1){
            pictureData.addElement(
                new RectData(x, y, e.getX(), e.getY(), col, size));
        }else if(figureFlag == 2){
            pictureData.addElement(
                new ellipseData(x, y, e.getX(), e.getY(), col, size));
        }else if(figureFlag == 3){
            pictureData.addElement(
                new FillRectData(x, y, e.getX(), e.getY(), col, size));
        }else if(figureFlag == 4){
            pictureData.addElement(
                new FillellipseData(x, y, e.getX(), e.getY(), col, size));
        }else if(figureFlag == 6){
            pictureData.addElement(
                new GradientLineData(x, y, e.getX(), e.getY(),
                col, size, col2));
        }else if(figureFlag == 7){
            pictureData.addElement(
                new GradientFillRectData(x, y, e.getX(), e.getY(),
                col, size, col2));
        }else if(figureFlag == 8){
            pictureData.addElement(
                new GradientFillellipseData(x, y, e.getX(), e.getY(),
                col, size, col2));
        }else if(figureFlag == 10){
            pictureData.addElement(
                new TextureLineData(x, y, e.getX(), e.getY(),
                col, size, image));
        }else if(figureFlag == 11){
            pictureData.addElement(
                new TextureFillRectData(x, y, e.getX(), e.getY(),
                col, size, image));
        }else if(figureFlag == 12){
            pictureData.addElement(
                new TextureFillellipseData(x, y, e.getX(), e.getY(),
                col, size, image));
        }
        repaint();
    }

    public void mouseClicked(MouseEvent e){}
    public void mouseMoved(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
}

abstract class Figure implements Serializable{
    protected float sx;
    protected float sy;
    protected float ex;
    protected float ey;
    protected Color col;
    protected float size;

    public Figure(){};

    public Figure(float x1, float y1, float x2, float y2, Color c, float s){
        sx = x1;
        sy = y1;
        ex = x2;
        ey = y2;
        col = c;
        size = s;
    }

    public void setColor(Color c){
        col = c;
    }

    abstract void Draw(Graphics2D g2);
}

class LineData extends Figure{
    public LineData(float x1, float y1, float x2, float y2, Color c, float s){
        super(x1, y1, x2, y2, c, s);
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.draw(new Line2D.Double(sx, sy, ex, ey));
    }
}

class RectData extends Figure{
    public RectData(float x1, float y1, float x2, float y2, Color c, float s){
        super(x1, y1, x2, y2, c, s);
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.draw(new Rectangle2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class ellipseData extends Figure{
    public ellipseData(float x1, float y1, float x2, float y2, Color c, float s){
        super(x1, y1, x2, y2, c, s);
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.draw(new Ellipse2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class FillRectData extends Figure{
    public FillRectData(float x1, float y1, float x2, float y2, Color c, float s){
        super(x1, y1, x2, y2, c, s);
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.fill(new Rectangle2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class FillellipseData extends Figure{
    public FillellipseData(float x1, float y1, float x2, float y2, Color c, float s){
        super(x1, y1, x2, y2, c, s);
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.fill(new Ellipse2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class FreeLineData extends Figure{
    Vector v = new Vector();
    public FreeLineData(Color c, float s){
        col = c;
        size = s;
    }

    public void addPoint(float x1, float y1, float x2, float y2){
        v.addElement(new LineData(x1, y1, x2, y2, col, size));
    }

    public void Draw(Graphics2D g2){
       for(int i = 0; i < v.size(); i++){
            ((LineData)v.elementAt(i)).Draw(g2);
        }
    }
}

class GradientLineData extends Figure{
    private Color col2;

    public GradientLineData(float x1, float y1, float x2, float y2,
        Color c, float s, Color c2){
        super(x1, y1, x2, y2, c, s);
        col2 = c2;
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.setPaint(new GradientPaint(sx<ex?sx:ex,  sy<ey?sy:ey,
            col, Math.abs(sx-ex), Math.abs(sy-ey), col2, true));
        g2.draw(new Line2D.Double(sx, sy, ex, ey));
    }
}

class GradientFillRectData extends Figure{
    private Color col2;

    public GradientFillRectData(float x1, float y1, float x2, float y2,
        Color c, float s, Color c2){
        super(x1, y1, x2, y2, c, s);
        col2 = c2;
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.setPaint(new GradientPaint(sx<ex?sx:ex,  sy<ey?sy:ey,
            col, Math.abs(sx-ex), Math.abs(sy-ey), col2, true));
        g2.fill(new Rectangle2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class GradientFillellipseData extends Figure{
    private Color col2;

    public GradientFillellipseData(float x1, float y1, float x2, float y2,
       Color c, float s, Color c2){
        super(x1, y1, x2, y2, c, s);
        col2 = c2;
    }

    public void Draw(Graphics2D g2){
        g2.setColor(col);
        g2.setStroke(new BasicStroke(size));
        g2.setPaint(new GradientPaint(sx<ex?sx:ex,  sy<ey?sy:ey,
            col, Math.abs(sx-ex), Math.abs(sy-ey), col2, true));
        g2.fill(new Ellipse2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class GradientFreeLineData extends Figure{
    private Vector v = new Vector();
    private BufferedImage image;
    private Color col2;

    public GradientFreeLineData(Color c, float s, Color c2){
        col = c;
        col2 = c2;
        size = s;
    }

    public void addPoint(float x1, float y1, float x2, float y2){
        v.addElement(new GradientLineData(x1, y1, x2, y2, col, size, col2));
    }

    public void Draw(Graphics2D g2){
       for(int i = 0; i < v.size(); i++){
            ((GradientLineData)v.elementAt(i)).Draw(g2);
        }
    }
}

class TextureLineData extends Figure{
    private BufferedImage image;

    public TextureLineData(float x1, float y1, float x2, float y2,
        Color c, float s, BufferedImage img){
        super(x1, y1, x2, y2, c, s);
        image = img;
    }

    public void Draw(Graphics2D g2){
        g2.setStroke(new BasicStroke(size));
        g2.setPaint(new TexturePaint(image,
            new Rectangle2D.Double(0, 0, image.getWidth(), image.getHeight())));
        g2.draw(new Line2D.Double(sx, sy, ex, ey));
    }
}

class TextureFillRectData extends Figure{
    private BufferedImage image;

    public TextureFillRectData(float x1, float y1, float x2, float y2,
        Color c, float s, BufferedImage img){
        super(x1, y1, x2, y2, c, s);
        image = img;
    }

    public void Draw(Graphics2D g2){
        g2.setStroke(new BasicStroke(size));
        g2.setPaint(new TexturePaint(image,
            new Rectangle2D.Double(0, 0, image.getWidth(), image.getHeight())));
        g2.fill(new Rectangle2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}


class TextureFillellipseData extends Figure{
    private BufferedImage image;

    public TextureFillellipseData(float x1, float y1, float x2, float y2,
        Color c, float s, BufferedImage img){
        super(x1, y1, x2, y2, c, s);
        image = img;
    }

    public void Draw(Graphics2D g2){
        g2.setStroke(new BasicStroke(size));
        g2.setPaint(new TexturePaint(image,
            new Rectangle2D.Double(0, 0, image.getWidth(), image.getHeight())));
        g2.fill(new Ellipse2D.Double(
            sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)));
    }
}

class TextureFreeLineData extends Figure{
    Vector v = new Vector();
    BufferedImage image;

    public TextureFreeLineData(Color c, float s, BufferedImage img){
        col = c;
        size = s;
        image = img;
    }

    public void addPoint(float x1, float y1, float x2, float y2){
        v.addElement(new TextureLineData(x1, y1, x2, y2, col, size, image));
    }

    public void Draw(Graphics2D g2){
       for(int i = 0; i < v.size(); i++){
            ((TextureLineData)v.elementAt(i)).Draw(g2);
        }
    }
}
実行サンプル
そろそろクラスごとにソースわけないと意味不明。

Advertisement

ショートカット

634トップページ
このカテゴリのトップページに戻る
634ラボ
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール