@634

JFC の おえかき。

Advertisement

Swing + Java2D

めんどくさいから一気に。

今のところの機能。
  • 図形描画
  • 色選択
  • ファイル保存・読み込み
  • 線の太さ選択
  • アンチエイリアス
  • Look & Feel 選択
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
import java.util.*;
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 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 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 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(){
        JMenuBar menuBar = new JMenuBar();
        JMenu file   = new JMenu("ファイル");
        JMenu edit   = new JMenu("編集");
        JMenu conf   = new JMenu("設定");
        JMenu help   = new JMenu("ヘルプ");
        JMenu figure = new JMenu("図形");
        JMenu line   = new JMenu("線の太さ");
        JMenu landf  = new JMenu("Look & Feel");
        open  = new JMenuItem("開く");
        save  = new JMenuItem("保存");
        quit  = new JMenuItem("終了");
        color = 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("塗りつぶし楕円");
        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);
        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);
        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);
        figure.add(fig_free);
        figure.add(fig_line);
        figure.add(fig_rect);
        figure.add(fig_elli);
        figure.add(fig_frec);
        figure.add(fig_fell);
        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(color);
        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()));
    }

    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_free)){
            panel.setFigureFlag(5);
        }else 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(antialias)){
            panel.setAntialias(!panel.getAntialias());
            panel.repaint();
        }else if(e.getSource().equals(color)){
            chooseColor();
        }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 float size;
    private Vector pictureData = new Vector();

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

        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 setVector(Vector v){
        pictureData = v;
    }

    public Vector getVector(){
        return pictureData;
    }

    public void paint(Graphics g){
        super.paint(g);
        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)));
            }
        }
    }

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

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

        if(figureFlag == 5){
            pictureData.addElement(new FreeLineData(col, size));
        }
    }

    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 OvalData(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 FillOvalData(x, y, e.getX(), e.getY(), col, size));
        }
        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;
    }

    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 OvalData extends Figure{
    public OvalData(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 FillOvalData extends Figure{
    public FillOvalData(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);
        }
    }
}
実行サンプル

Advertisement

ショートカット

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

サイト検索

Google

Web サイト内

Y!ログール