FC2ブログ

機械を触る機会!なんちゃって・・・

機械系の仕事ってほとんどが部品加工かCADというグラッフィク設計をするんだ

電気系はブログに載せきれてないこともあってもう色々やってるんだけど

ミニ四駆とかまさに工学ノウハウが付く・・以外にも
そこからロボコンとかどんどん触れていくかもね
ミニ四駆でライントレーサーマイコンカーにするのも悪く無い

本日はJavaで描画ムラが無く、リサイズしても崩れない、できるとこまで最適化した
基本のペイントツールを作成
ここからペイントソフト→3Dグラフィックへ強めていこうかな

とりあえず基本ソースコードを!黒鉛筆以外ブラシの選択はないけどね

package d2_paint;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;


//メインフレーム
class D2Frame extends JFrame {
private JMenuBar jmb_main;
private JMenu jm_file;
private JMenu jm_edit;
private JMenu jm_view;
private ViewerWindow vw;
private boolean resize_flg=false; //ウィンドウサイズ変更時のフラグ

public D2Frame(){ //コンストラクタ
        //フレーム vmはWindowsの表示形式にする為のもの。無くても良いから・・
super("D2System - Frame works -");
vw = new ViewerWindow();
vw.setViewerWindow(this, "windows");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(vw.getScreenWidth()/2-512,vw.getScreenHeight()/2-384,1024,768);
this.setBackground(Color.white);

        //フレームに描画領域を設定
this.setContentPane(new D2DrawEx());

        //メニューバー等
jmb_main = new JMenuBar();
jm_file = new JMenu("ファイル");
jm_edit = new JMenu("編集");
jm_view = new JMenu("表示");
jmb_main.add(jm_file);
jmb_main.add(jm_edit);
jmb_main.add(jm_view);
jmb_main.setDoubleBuffered(true);
jmb_main.setOpaque(false);
this.setJMenuBar(jmb_main);

this.addComponentListener(new ResizeEventAction());
this.validate();
this.setVisible(true);
}

    //描画クラス
public class D2DrawEx extends JPanel implements Runnable {
private MouseEventAction mea;
private ResizeEventAction rea;
private BufferedImage bi;
private Graphics gbi;
private Point end,start;
private int inputButton = InputEvent.BUTTON1_DOWN_MASK;
private boolean move_flg=false;

public D2DrawEx(){ //コンストラクタ
mea = new MouseEventAction();
end = new Point();
start = new Point();
bi = null;
this.setOpaque(false);
this.setDoubleBuffered(true);
this.addMouseListener(mea);
this.addMouseMotionListener(mea);
this.addComponentListener(rea);
this.setVisible(true);
}

        //マウスイベントの集約
public class MouseEventAction extends MouseAdapter {

public void mousePressed(MouseEvent e) {
if((e.getModifiersEx()&(inputButton))==inputButton){
start.setLocation(e.getPoint());
end.setLocation(e.getPoint());
new Thread(D2DrawEx.this).start();
}
}

public void mouseDragged(MouseEvent e) {
if((e.getModifiersEx()&(inputButton))==inputButton){
start.setLocation(end);
end.setLocation(e.getPoint());
new Thread(D2DrawEx.this).start();
move_flg=true;
}
}

}

        //描画時のバッファリング
public void update(Graphics g){
this.paint(g);
}

        //描画メソッド
public void paint(Graphics g){
if(bi==null){
bi = (BufferedImage)this.createImage(getWidth(), getHeight());
}
if(resize_flg){
Rectangle rc = D2DrawEx.this.getBounds();
if((rc.getWidth()>bi.getWidth())||(rc.getHeight()>bi.getHeight())){
BufferedImage bf=(BufferedImage) D2DrawEx.this.createImage(D2DrawEx.this.getWidth(),D2DrawEx.this.getHeight());
bf.getGraphics().drawImage(bi,0,0,D2DrawEx.this);
bi=bf;
}
resize_flg=false;
}
gbi=bi.createGraphics();
gbi.drawLine(end.x, end.y,start.x,start.y);
g.drawImage(bi, 0, 0, this);
}

//描画時マルチスレッド
public void run() {
while(!move_flg){
try {
this.repaint();
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
move_flg=false;
}

}

    //リサイズ例外
public class ResizeEventAction extends ComponentAdapter{
public void componentResized(ComponentEvent e) {
resize_flg=true;
D2Frame.this.getContentPane().repaint();
}
}
}

public class D2Paint {

public static void main(String[] args) {
new D2Frame();

}

}
スポンサーサイト



テーマ : 日記
ジャンル : 日記

コメントの投稿

非公開コメント

ぶろぐかんりしゃ

SmartWoods
最近MoEは・・・
一休み

***** ひとこと *****

MoEの後継ともいわれる
Resonance gamez
完全スキルMMOが
気になるところ



********************


↓2016/3/26更新
My MoE









**********

NEWとらっくばっく
あーかいぶ
かてごりー
リンク
ぶろぐないけんさく
RSSふぃーど
おともだちになろ

この人とブロともになる