/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- VectorFrame
- main
- init
- paint
- CanvasNime
- paint
- InitBtn
- actionPerformed
- saveBtn
- actionPerformed
- LoadBtn
- actionPerformed
- evtMouse
- mousePressed
- mouseDragged
- mouseReleased
package jp.ac.nime.computer.grpsimulator.VecPr;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import jp.ac.nime.computer.grpsimulator.*;
/** 画像データ表現 点用専用データファイルを作成するためのプログラム用メインクラス
* @version 1.0.0
* @author kikuchi
*/
public class VectorFrame extends JFrame {
JButton jButton0_;
JLabel jlabel2_;
JButton jButton1_;
JButton jButton2_;
Canvas jCanvas_;
int drawFlg_ = 0; // 描画ツールを識別するフラグ変数
int pressX_ = 0, pressY_ =0; // Mouseが押された位置のxy座標
static int start_x_ = 0, start_y_ = 0; // 描画の開始位置(左上xy座標)
Color drawColor = Color.black;
// 図形データ
GrpSimVectorData gsvd_;
// 一回のマウスドラッグで覚える座標
int[] drX_, drY_;
int numDr_; // ドラッグしたときのポイント数
// 表示領域
int width_, height_;
BufferedImage img_;
// file 入出
String dstPath_;
String srcPath_;
public VectorFrame(){ // コンストラクタ
init();
gsvd_ = new GrpSimVectorData();
drX_ = new int [2048];
drY_ = new int [2028];
width_ = 320;
height_ = 240;
img_ = new BufferedImage(width_, height_, BufferedImage.TYPE_INT_ARGB);
for (int h = 0; h < height_ ; h ++) {
for (int w = 0; w < width_; w ++) {
img_.setRGB(w, h, 0xffffffff);
}
}
//
setTitle("DDVD File Editer");
//
dstPath_ = new String();
srcPath_ = new String();
}
public static void main(String args[]) {
VectorFrame df = new VectorFrame();
df.setVisible(true);
}
public void init() {
//this.setSize(new Dimension(300, 250));
setBackground(Color.white);
jButton0_ = new JButton("Mouseで図形を描いてください。(初期化)");
jButton0_.setVisible(true);
jButton0_.addActionListener(new InitBtn());
getContentPane().add(jButton0_, BorderLayout.NORTH);
jlabel2_ = new JLabel("結果を表示");
jlabel2_.setVisible(true);
getContentPane().add(jlabel2_, BorderLayout.SOUTH);
jButton1_ = new JButton("Load");
jButton1_.addActionListener(new LoadBtn(this));
getContentPane().add(jButton1_, BorderLayout.WEST);
jButton2_ = new JButton("Save");
jButton2_.addActionListener(new saveBtn(this));
getContentPane().add(jButton2_, BorderLayout.EAST);
//jCanvas_ = new CanvasNime();
//getContentPane().add(jCanvas_, BorderLayout.CENTER);
// イベント
addMouseListener(new evtMouse());
addMouseMotionListener(new evtMouse());
/* 終了処理を追加 */
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);}
});
setSize(500, 400);
start_x_ = 0;
start_y_ = 0;
}
public void paint(Graphics g){
// 描画位置
if (start_x_ == 0) {
start_x_ = jButton1_.getBounds().x + jButton1_.getBounds().width + 20;
start_y_ = jButton1_.getBounds().y + 30;
}
super.paint(g);
gsvd_.write(img_);
g.drawImage(img_, start_x_, start_y_, this);
/*
g.setColor(drawColor);
start_x = Math.min(pressX,X); // MouseのPress/Release時の小さいほうのx座標
start_y = Math.min(pressY,Y); // MouseのPress/Release時の小さいほうのy座標
draw_w = Math.abs(pressX-X); //Mouseがドラッグされた範囲の幅
draw_h = Math.abs(pressY-Y); //Mouseがドラッグされた範囲の高さ
if(drawFlg == 1)
g.drawLine(pressX,pressY,X,Y);//直線を描画
else if(drawFlg == 2)
g.drawRect(start_x,start_y,draw_w,draw_h); //四角形を描画
else if(drawFlg == 3)
g.drawOval(start_x,start_y,draw_w,draw_h); //楕円を描画
*/
}
class CanvasNime extends Canvas {
public void paint(Graphics g) {
gsvd_.write(img_);
g.drawImage(img_, start_x_, start_y_, this);
}
}
public class InitBtn implements ActionListener {
public void actionPerformed(ActionEvent e){
// クリア
gsvd_.clr();
for (int h = 0; h < height_ ; h ++) {
for (int w = 0; w < width_; w ++) {
img_.setRGB(w, h, 0xffffffff);
}
}
repaint();
}
}
// --- 内部クラス
/** SaveButton処理
*/
public class saveBtn implements ActionListener {
Component cmp_;
public saveBtn(Component cmp) {
cmp_ = cmp;
}
public void actionPerformed(ActionEvent e){
if (gsvd_.size() == 0) return; // saveする内容がない
JFileChooser fc = new JFileChooser(dstPath_);
fc.setAcceptAllFileFilterUsed(false);
FileFilterNime dsddFilter = new FileFilterNime(".gsdd", "GrpSimDraw-File");
fc.addChoosableFileFilter(dsddFilter);
fc.setFileFilter( dsddFilter );
if (JFileChooser.APPROVE_OPTION == fc.showSaveDialog(cmp_)) {
dstPath_ = fc.getCurrentDirectory().getAbsolutePath();
File f = fc.getSelectedFile();
if (f != null) {
setCursor( Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR) );
try{
// 指定されたファイル形式で保存する
FileFilterNime filter = (FileFilterNime)fc.getFileFilter();
if (!filter.accept(f)) { // 拡張子が無い時は付ける
File f2 = new File(f.getAbsolutePath() + filter.getExtension());
if (!f2.isDirectory()) f = f2;
}
// 出力
FileOutputStream fo = new FileOutputStream(f);
PrintStream ps = new PrintStream(fo);
String lines[] = gsvd_.toLines(); // data化
for (int i = 0; i < gsvd_.size(); i ++) {
ps.println(lines[i]);
}
ps.close();
fo.close();
} catch(IOException ee) {}
setCursor( Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) );
}
}
}
}
/** LoadButton処理
*/
public class LoadBtn implements ActionListener {
Component cmp_;
public LoadBtn(Component cmp) {
cmp_ = cmp;
}
public void actionPerformed(ActionEvent e){
JFileChooser fc = new JFileChooser(srcPath_);
FileFilterNime dsddFilter = new FileFilterNime(".dsdd", "GrpSimDraw-File");
fc.addChoosableFileFilter( dsddFilter );
fc.setFileFilter( dsddFilter );
if (JFileChooser.APPROVE_OPTION == fc.showOpenDialog(cmp_)) {
srcPath_ = fc.getCurrentDirectory().getAbsolutePath();
File f = fc.getSelectedFile();
if (f!=null) {
setCursor( Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR) );
try{
// クリア
gsvd_.clr();
// 入力 全ての行を読む
FileInputStream fi = new FileInputStream(fc.getSelectedFile());
BufferedReader br = new BufferedReader(new InputStreamReader(fi));
while (br.ready()) {
String str = br.readLine();
gsvd_.add(str);
}
br.close();
fi.close();
}
catch(Exception ee) {}
setCursor( Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) );
}
}
}
}
public class evtMouse extends MouseInputAdapter { // マウスリスナーを作成
/** マウスpush
*/
public void mousePressed(MouseEvent e) {
pressX_ = e.getX() - start_x_;
pressY_ = e.getY() - start_y_;
numDr_ = 1; // ドラッグ開始
drX_[0] = pressX_;
drY_[0] = pressY_;
if (e.getModifiers() == InputEvent.BUTTON1_MASK) { //左Buttonの場合
jlabel2_.setText("左ボタンのPush位置は X = " + pressX_ + ", Y = " + pressY_);
}
}
public void mouseDragged(MouseEvent e) {
int x, y;
x = e.getX() - start_x_;
y = e.getY() - start_y_;
if (SwingUtilities.isLeftMouseButton(e)) { //左Buttonの場合
jlabel2_.setText("現在位置は X = " + x + ", Y = " + y);
if(e.isShiftDown()) drawFlg_ = 1;
else if(e.isControlDown()) drawFlg_ = 2;
else if(e.isAltDown()) drawFlg_ = 3;
else drawFlg_ = 0;
if (drawFlg_ == 0) {
// 座標記憶
drX_[numDr_] = x;
drY_[numDr_] = y;
numDr_ ++;
img_.setRGB(x, y, 0xff000000);
repaint();
}
}
// 次のために
pressX_ = x;
pressY_ = y;
}
/** マウスリリース
*/
public void mouseReleased(MouseEvent e) {
if (numDr_ > 1) {
// Polineを設定
gsvd_.addPoline(numDr_, drX_, drY_);
numDr_ = 0;
repaint();
}
}
}
}