SimpleDraw
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* Java swing を使ったお絵描きプログラム [#h604d72c]
**javaのマニュアル [#pf1a0c93]
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/...
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
http://docs.oracle.com/javase/jp/6/api/
** 線を引く簡単なプログラム [#pac2b7d5]
JPanelのサブクラスを作りました。
import javax.swing.JPanel;
import java.awt.Graphics;
public class DrawPanel extends JPanel {
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.drawLine(x1, y1, x2, y2);
}
}
こちらはメインのプログラム。JFrameのサブクラスで、これに...
リスナーになっているので、こちらでマウスなどのイベントを...
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
public class SimpleDraw extends JFrame implements MouseM...
int lastx=0, lasty=0, newx, newy;
DrawPanel panel;
public void mouseMoved(MouseEvent arg0) {
}
public void mouseDragged(MouseEvent arg0) {
newx=arg0.getX();
newy=arg0.getY();
panel.drawLine(lastx,lasty,newx,newy);
lastx=newx;
lasty=newy;
}
private void init() {
this.setTitle("Simple Draw");
this.setSize(300, 200);
this.addMouseMotionListener(this);
panel=new DrawPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SimpleDraw frame=new SimpleDraw();
frame.init();
}
}
**(演習課題1)上のお絵描きプログラムを改良してください [#m...
上のプログラムでは,描画するとゴミが出ます.
これを出ないように改良してください.
+上のプログラムでは、マウスポインターの位置と、描かれる線...
+上のプログラムでは,描画するとゴミが出ます. (前回描き...
一筆書きを解消するヒント
-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimple...
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/ev...
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/...
解答編はこちら SimpleDraw_Ans1
**(演習課題2)お絵描きプログラムに以下の機能を追加してくだ...
-メニューから以下の機能を利用できるようにする
--色が変えられる
http://is.ocha.ac.jp/~siio/gyazo/java_simple_draw.png
このプログラムのjavaとclassファイルをフォルダに入れて,学...
-----------------------
//**(演習課題3)お絵描きプログラムに以下の機能を追加してく...
**さらに改良をすすめましょう [#d0370b3e]
-メニューから以下の機能を利用できるようにする
--色が変えられる
--線の太さが変えられる
--消しゴム機能を利用する
以下にヒントとなる情報を書いておきます.
**色の変え方 [#v681acc2]
GraphicsのsetColorメソッドで色を変えられます。
public class DrawPanel extends JPanel {
// (略)
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.setColor(Color.yellow);
g.drawLine(x1, y1, x2, y2);
}
// (略)
}
**SimpleDrawのインスタンスの中から、DrawPanelの色を変える...
メインのSimpleDrawが呼び出すメソッドとして、例えばsetPenC...
public class DrawPanel extends JPanel {
// (略)
Color currentColor=Color.black;
// (略)
// 以下の関数は、引数で指定された色に設定します。
public void setPenColor(Color newColor) {
currentColor = newColor;
}
// (略)
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.setColor(currentColor);
g.drawLine(x1, y1, x2, y2);
}
// (略)
}
そして、SimpleDrawのインスタンスから、これを呼び出せば色...
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
// メソッド間でpanelのインスタンスを共同利用するために...
DrawPanel panel;
// (略)
// どこかのメソッドでDrawPanelを作って変数panelに入れて...
panel=new DrawPanel();
// (略)
// どこか別のメソッドでこの変数panelを利用します。色を...
panel.setPenColor(Color.black);
// (略)
}
**太い線を引くには [#h3f95aa7]
Graphicsクラスを拡張した(継承した)Graphics2Dクラスを使...
public class DrawPanel extends JPanel {
// (略)
Float currentWidth=20.0f;
// (略)
public void drawLine(int x1, int y1, int x2, int y2){
Graphics2D g = (Graphics2D)this.getGraphics();
//太さがcurrentWidth の線を描く.線の両端は丸くする.
g.setStroke(new BasicStroke(currentWidth ,BasicStroke....
g.drawLine(x1, y1, x2, y2);
}
// (略)
}
**SimpleDrawのインスタンスの中から、DrawPanelの線の太さを...
これも、色の場合と同じく、太さの変数を外部から変更するメ...
public class DrawPanel extends JPanel {
// (略)
Float currentWidth=20.0f;
// (略)
public void setPenWidth(float newWidth) {
currentWidth = newWidth;
}
// (略)
}
**メニューを簡単に書くためのヒント [#k44ebcec]
教科書の方法ではメニューアイテムを一つ定義するのに、何行...
#ref(menu1.png);
というようなメニューは、
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
private void initMenu() {
JMenuBar menubar=new JMenuBar();
JMenu menuFile = new JMenu("File");
JMenuItem itemNew = new JMenuItem("New");
itemNew.setActionCommand("New");
itemNew.addActionListener(this);
menuFile.add(itemNew);
JMenuItem itemOpen = new JMenuItem("Open...");
itemOpen.setActionCommand("Open");
itemOpen.addActionListener(this);
menuFile.add(itemOpen);
JMenuItem itemSave = new JMenuItem("Save...");
itemSave.setActionCommand("Save");
itemSave.addActionListener(this);
menuFile.add(itemSave);
menubar.add(menuFile);
this.setJMenuBar(menubar);
}
// (略)
}
として表示できます。
でもまだ簡単にできそうです。
というのは、よく見ると同じことを繰り返していますし、JMenu...
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
private void addMenuItem
(JMenu targetMenu, String itemName, String actionName, ...
JMenuItem menuItem = new JMenuItem(itemName);
menuItem.setActionCommand(actionName);
menuItem.addActionListener(listener);
targetMenu.add(menuItem);
}
private void initMenu() {
JMenuBar menubar=new JMenuBar();
JMenu menuFile = new JMenu("File");
this.addMenuItem(menuFile,"New","New",this);
this.addMenuItem(menuFile,"Open...","Open",this);
this.addMenuItem(menuFile,"Save...","Save",this);
menubar.add(menuFile);
this.setJMenuBar(menubar);
}
// (略)
}
これでしたらこんな
#ref(menu2.png);
メニューでも、以下のように作れます。
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
private void addMenuItem
(JMenu targetMenu, String itemName, String actionName, ...
JMenuItem menuItem = new JMenuItem(itemName);
menuItem.setActionCommand(actionName);
menuItem.addActionListener(listener);
targetMenu.add(menuItem);
}
private void initMenu() {
JMenuBar menubar=new JMenuBar();
JMenu menuFile = new JMenu("File");
this.addMenuItem(menuFile,"New","New",this);
this.addMenuItem(menuFile,"Open...","Open",this);
this.addMenuItem(menuFile,"Save...","Save",this);
menubar.add(menuFile);
JMenu menuPen = new JMenu("Pen");
this.addMenuItem(menuPen, "Color...", "Color", this);
JMenu menuWidth = new JMenu("Width");
this.addMenuItem(menuWidth, "width1", "width1", this);
this.addMenuItem(menuWidth, "width5", "width5", this);
this.addMenuItem(menuWidth, "width10", "width10", this);
this.addMenuItem(menuWidth, "width20", "width20", this);
menuPen.add(menuWidth);
menubar.add(menuPen);
this.setJMenuBar(menubar);
}
// (略)
}
**メニューによって線の太さを変更する [#c9a2a92a]
上記のようにメニューを作った場合、メニューが選択されると...
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
//(略)
DrawPanel panel;
//(略)
public void actionPerformed(ActionEvent arg0) {
if(arg0.getActionCommand().equals("width1"))
panel.setPenWidth(1);
else if(arg0.getActionCommand().equals("width5"))
panel.setPenWidth(5);
else if(arg0.getActionCommand().equals("width10"))
panel.setPenWidth(10);
else if(arg0.getActionCommand().equals("width20"))
panel.setPenWidth(20);
}
//(略)
}
**メニューによって色を変更する [#g6fb08bf]
これも同様です。black, white, yellowなどの色のメニューア...
**色を選ぶときにJColorChooserを使う [#d3e5fa22]
メニューから色の名前を選ぶ他に、教科書の最後のページにあ...
**消しゴム機能を作る [#wae903b5]
消しゴムは、白色で描く機能を用意します。消しゴムの太さな...
**ウィンドウに直接描かないでバッファに描く [#buffer]
上の例では,ウィンドウの面に直接描画していました.いわば...
バッファのために、Imageとこれから作るGraphicsのインスタン...
下の例では、drawLineでバッファが作ってない場合に作るよう...
// (略)
import java.awt.image.*;
// (略)
public class DrawPanel extends JPanel {
BufferedImage bufferImage=null;
Graphics2D bufferGraphics=null;
// (略)
private void createBuffer(int width, int height) {
//バッファ用のImageとGraphicsを用意する
bufferImage = new BufferedImage(width, height,Buffered...
bufferGraphics=bufferImage.createGraphics(); //getGrap...
bufferGraphics.setBackground(Color.white);
bufferGraphics.clearRect(0, 0, width, height); //バッ...
}
// (略)
public void drawLine(int x1, int y1, int x2, int y2){ ...
if(null==bufferGraphics) {
this.createBuffer(this.getWidth(),this.getHeight());...
// (略) //最初の描画要求なので初期化したいことがも...
}
// bufferGraphics.setColor( (略) //Graphics2Dのイン...
// bufferGraphics.setStroke( (略) //setSctokeで太さな...
bufferGraphics.drawLine(x1, y1, x2, y2); // バッファに...
repaint();//再描画するためpaintComponentを呼び出す。
//repaintメソッドは親Classで定義されているがpaintCompo...
}
// (略)
// repaintメソッドがpaintComponentを呼ぶので、バッファを...
public void paintComponent(Graphics g) {
super.paintComponent(g);//他に描画するものがあるかもし...
if(null!=bufferImage) g.drawImage(bufferImage, 0,0,thi...
}
// (略)
}
この例では、ウィンドウの大きさのバッファを作っています。...
最低限でもここまでの内容を完成して、提出してください。
*以下は、応用編です [#c56aa808]
以下のテーマに挑戦してください。
ここより先の機能が実現できていれば成績に加算いたします.
**JPEGファイル(写真)などを表示してこれにお絵描きする [#...
ImageIOというクラスのクラスメソッドreadを使うと,JPEGやGI...
以下のopenFileメソッドでは,引数のFile型インスタンスで指...
これを上記のSimpleDrawのインスタンスの中で呼び出すために...
panel.openFile(new File("sample.jpg"));
というようにします。こうするとこのプログラムが置かれた場...
public class DrawPanel extends JPanel {
// (略)
BufferedImage bufferImage=null;
Graphics2D bufferGraphics=null;
// (略)
private void createBuffer(int width, int height) {
//バッファ用のImageとGraphicsを用意する
bufferImage = new BufferedImage(width, height,Buffered...
bufferGraphics=bufferImage.createGraphics(); //getGrap...
bufferGraphics.setBackground(Color.white);
}
// (略)
public void openFile(File file2open){
BufferedImage pictureImage;
try {
pictureImage = ImageIO.read(file2open);
} catch(Exception e){
System.out.println("Error: reading file="+file2open.g...
return;
}
//画像に合わせたサイズでbufferImageとbufferGraphicsを...
//ImageIO.readの戻り値をbufferImageに代入するのでは駄...
this.createBuffer(pictureImage.getWidth(),pictureImage...
bufferGraphics.drawImage(pictureImage,0,0,this);
repaint(); //画像を表示するためにpaintComponentを呼ぶ
}
// (略)
}
**お絵描きした内容をJPEGファイルとして保存する [#o677b605]
これもImageIOというクラスのクラスメソッドwriteを使います...
以下のsaveFileメソッドでは,引数のFile型インスタンスで指...
public class DrawPanel extends JPanel {
// (略)
BufferedImage bufferImage=null;
// (略)
public void saveFile(File file2save) {
try {
ImageIO.write(bufferImage, "jpg", file2save);
} catch (Exception e) {
System.out.println("Error: writing file="+file2save.g...
return;
}
}
// (略)
}
**読み込むファイル/書き込むファイルをダイアログパネルで...
JFileChooserを使うと、読み込み/書き込みファイルの指定の...
ipublic class SimpleDraw extends JFrame implements Actio...
MouseListener, MouseMotionListener {
// (略)
DrawPanel panel;
JFileChooser fileChooser;
// (略)
public void actionPerformed(ActionEvent arg0) {
// (略)
else if(arg0.getActionCommand().equals("Open")) {
int returnVal = fileChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
panel.openFile(fileChooser.getSelectedFile());
}
}
else if(arg0.getActionCommand().equals("Save")) {
int returnVal = fileChooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
panel.saveFile(fileChooser.getSelectedFile());
}
}
// (略)
}
// (略)
//どこか最初に実行される場所
fileChooser = new JFileChooser();
//(略)
}
**このほかいろいろと機能を追加してみてください [#extra]
あとは工夫次第で便利な/面白い機能を追加してください。ど...
-便利な機能
--描画面全体を消して白紙にする機能
--領域を指定してコピーペースト移動等を行う機能
--描画中の内容を消さずに、その内容の任意の場所に、写真を...
--イメージを拡大縮小する機能
--指定した文字列が画像に書き込まれる機能
--指定した矩形を塗りつぶす/消す機能
--円や矩形や多角形を線で書く機能
-- 矩形や多角形を塗りつぶして書く機能
--大きな写真の場合、スクロールして閲覧/編集する機能
--絵の任意の場所をクリックするとそこの色を取得してペンな...
-使いやすい工夫
--ペンの太さなどをスライダで指定する機能
--現在の色、ペン太さ、フォント種類、描画モード(手書きか...
--市販のお絵かきプログラムにあるような、別ウィンドウでペ...
http://gyazo.com/e494357afb0d024c38d19c470e5493e5.png
http://gyazo.com/424f8502af49121709bdc994a2684592.png
http://gyazo.com/86935ab91636a836d7c2bc06dde675b7.png
-おもしろい(かもしれない)機能
--適当な小さなイメージを指定するとそれがスタンプになって...
--画面中央を境に、いつでも左右対称に描画される機能。もし...
--ドラッグさせて描いているとどんどん色が変わっていく虹色...
--指定された文字列がマウスのドラッグに従って書かれて行く...
#ref(textpen.png);
**先輩が作った優秀作品紹介 [#b13097a9]
添付の2007.zip, 2008.zip, 2009.zip, 2010sample.zipに,200...
//** 2006年度の先輩が作った優秀作品紹介 [#ae3ed1eb]
//
//添付のdraw.jarとdraw2.jarを試してみてください。draw.jar...
//draw2.jarはすこしバグがあるようで止まってしまうことがあ...
**先輩が作った優秀な取扱説明書 [#xef7c661]
-http://is.ocha.ac.jp/~siio/pdf/2013/manual1.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual2.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual3.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual4.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual5.pdf
------
このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。
終了行:
* Java swing を使ったお絵描きプログラム [#h604d72c]
**javaのマニュアル [#pf1a0c93]
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/...
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
http://docs.oracle.com/javase/jp/6/api/
** 線を引く簡単なプログラム [#pac2b7d5]
JPanelのサブクラスを作りました。
import javax.swing.JPanel;
import java.awt.Graphics;
public class DrawPanel extends JPanel {
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.drawLine(x1, y1, x2, y2);
}
}
こちらはメインのプログラム。JFrameのサブクラスで、これに...
リスナーになっているので、こちらでマウスなどのイベントを...
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
public class SimpleDraw extends JFrame implements MouseM...
int lastx=0, lasty=0, newx, newy;
DrawPanel panel;
public void mouseMoved(MouseEvent arg0) {
}
public void mouseDragged(MouseEvent arg0) {
newx=arg0.getX();
newy=arg0.getY();
panel.drawLine(lastx,lasty,newx,newy);
lastx=newx;
lasty=newy;
}
private void init() {
this.setTitle("Simple Draw");
this.setSize(300, 200);
this.addMouseMotionListener(this);
panel=new DrawPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SimpleDraw frame=new SimpleDraw();
frame.init();
}
}
**(演習課題1)上のお絵描きプログラムを改良してください [#m...
上のプログラムでは,描画するとゴミが出ます.
これを出ないように改良してください.
+上のプログラムでは、マウスポインターの位置と、描かれる線...
+上のプログラムでは,描画するとゴミが出ます. (前回描き...
一筆書きを解消するヒント
-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimple...
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/ev...
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/...
解答編はこちら SimpleDraw_Ans1
**(演習課題2)お絵描きプログラムに以下の機能を追加してくだ...
-メニューから以下の機能を利用できるようにする
--色が変えられる
http://is.ocha.ac.jp/~siio/gyazo/java_simple_draw.png
このプログラムのjavaとclassファイルをフォルダに入れて,学...
-----------------------
//**(演習課題3)お絵描きプログラムに以下の機能を追加してく...
**さらに改良をすすめましょう [#d0370b3e]
-メニューから以下の機能を利用できるようにする
--色が変えられる
--線の太さが変えられる
--消しゴム機能を利用する
以下にヒントとなる情報を書いておきます.
**色の変え方 [#v681acc2]
GraphicsのsetColorメソッドで色を変えられます。
public class DrawPanel extends JPanel {
// (略)
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.setColor(Color.yellow);
g.drawLine(x1, y1, x2, y2);
}
// (略)
}
**SimpleDrawのインスタンスの中から、DrawPanelの色を変える...
メインのSimpleDrawが呼び出すメソッドとして、例えばsetPenC...
public class DrawPanel extends JPanel {
// (略)
Color currentColor=Color.black;
// (略)
// 以下の関数は、引数で指定された色に設定します。
public void setPenColor(Color newColor) {
currentColor = newColor;
}
// (略)
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.setColor(currentColor);
g.drawLine(x1, y1, x2, y2);
}
// (略)
}
そして、SimpleDrawのインスタンスから、これを呼び出せば色...
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
// メソッド間でpanelのインスタンスを共同利用するために...
DrawPanel panel;
// (略)
// どこかのメソッドでDrawPanelを作って変数panelに入れて...
panel=new DrawPanel();
// (略)
// どこか別のメソッドでこの変数panelを利用します。色を...
panel.setPenColor(Color.black);
// (略)
}
**太い線を引くには [#h3f95aa7]
Graphicsクラスを拡張した(継承した)Graphics2Dクラスを使...
public class DrawPanel extends JPanel {
// (略)
Float currentWidth=20.0f;
// (略)
public void drawLine(int x1, int y1, int x2, int y2){
Graphics2D g = (Graphics2D)this.getGraphics();
//太さがcurrentWidth の線を描く.線の両端は丸くする.
g.setStroke(new BasicStroke(currentWidth ,BasicStroke....
g.drawLine(x1, y1, x2, y2);
}
// (略)
}
**SimpleDrawのインスタンスの中から、DrawPanelの線の太さを...
これも、色の場合と同じく、太さの変数を外部から変更するメ...
public class DrawPanel extends JPanel {
// (略)
Float currentWidth=20.0f;
// (略)
public void setPenWidth(float newWidth) {
currentWidth = newWidth;
}
// (略)
}
**メニューを簡単に書くためのヒント [#k44ebcec]
教科書の方法ではメニューアイテムを一つ定義するのに、何行...
#ref(menu1.png);
というようなメニューは、
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
private void initMenu() {
JMenuBar menubar=new JMenuBar();
JMenu menuFile = new JMenu("File");
JMenuItem itemNew = new JMenuItem("New");
itemNew.setActionCommand("New");
itemNew.addActionListener(this);
menuFile.add(itemNew);
JMenuItem itemOpen = new JMenuItem("Open...");
itemOpen.setActionCommand("Open");
itemOpen.addActionListener(this);
menuFile.add(itemOpen);
JMenuItem itemSave = new JMenuItem("Save...");
itemSave.setActionCommand("Save");
itemSave.addActionListener(this);
menuFile.add(itemSave);
menubar.add(menuFile);
this.setJMenuBar(menubar);
}
// (略)
}
として表示できます。
でもまだ簡単にできそうです。
というのは、よく見ると同じことを繰り返していますし、JMenu...
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
private void addMenuItem
(JMenu targetMenu, String itemName, String actionName, ...
JMenuItem menuItem = new JMenuItem(itemName);
menuItem.setActionCommand(actionName);
menuItem.addActionListener(listener);
targetMenu.add(menuItem);
}
private void initMenu() {
JMenuBar menubar=new JMenuBar();
JMenu menuFile = new JMenu("File");
this.addMenuItem(menuFile,"New","New",this);
this.addMenuItem(menuFile,"Open...","Open",this);
this.addMenuItem(menuFile,"Save...","Save",this);
menubar.add(menuFile);
this.setJMenuBar(menubar);
}
// (略)
}
これでしたらこんな
#ref(menu2.png);
メニューでも、以下のように作れます。
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
// (略)
private void addMenuItem
(JMenu targetMenu, String itemName, String actionName, ...
JMenuItem menuItem = new JMenuItem(itemName);
menuItem.setActionCommand(actionName);
menuItem.addActionListener(listener);
targetMenu.add(menuItem);
}
private void initMenu() {
JMenuBar menubar=new JMenuBar();
JMenu menuFile = new JMenu("File");
this.addMenuItem(menuFile,"New","New",this);
this.addMenuItem(menuFile,"Open...","Open",this);
this.addMenuItem(menuFile,"Save...","Save",this);
menubar.add(menuFile);
JMenu menuPen = new JMenu("Pen");
this.addMenuItem(menuPen, "Color...", "Color", this);
JMenu menuWidth = new JMenu("Width");
this.addMenuItem(menuWidth, "width1", "width1", this);
this.addMenuItem(menuWidth, "width5", "width5", this);
this.addMenuItem(menuWidth, "width10", "width10", this);
this.addMenuItem(menuWidth, "width20", "width20", this);
menuPen.add(menuWidth);
menubar.add(menuPen);
this.setJMenuBar(menubar);
}
// (略)
}
**メニューによって線の太さを変更する [#c9a2a92a]
上記のようにメニューを作った場合、メニューが選択されると...
public class SimpleDraw extends JFrame implements Action...
MouseListener, MouseMotionListener {
//(略)
DrawPanel panel;
//(略)
public void actionPerformed(ActionEvent arg0) {
if(arg0.getActionCommand().equals("width1"))
panel.setPenWidth(1);
else if(arg0.getActionCommand().equals("width5"))
panel.setPenWidth(5);
else if(arg0.getActionCommand().equals("width10"))
panel.setPenWidth(10);
else if(arg0.getActionCommand().equals("width20"))
panel.setPenWidth(20);
}
//(略)
}
**メニューによって色を変更する [#g6fb08bf]
これも同様です。black, white, yellowなどの色のメニューア...
**色を選ぶときにJColorChooserを使う [#d3e5fa22]
メニューから色の名前を選ぶ他に、教科書の最後のページにあ...
**消しゴム機能を作る [#wae903b5]
消しゴムは、白色で描く機能を用意します。消しゴムの太さな...
**ウィンドウに直接描かないでバッファに描く [#buffer]
上の例では,ウィンドウの面に直接描画していました.いわば...
バッファのために、Imageとこれから作るGraphicsのインスタン...
下の例では、drawLineでバッファが作ってない場合に作るよう...
// (略)
import java.awt.image.*;
// (略)
public class DrawPanel extends JPanel {
BufferedImage bufferImage=null;
Graphics2D bufferGraphics=null;
// (略)
private void createBuffer(int width, int height) {
//バッファ用のImageとGraphicsを用意する
bufferImage = new BufferedImage(width, height,Buffered...
bufferGraphics=bufferImage.createGraphics(); //getGrap...
bufferGraphics.setBackground(Color.white);
bufferGraphics.clearRect(0, 0, width, height); //バッ...
}
// (略)
public void drawLine(int x1, int y1, int x2, int y2){ ...
if(null==bufferGraphics) {
this.createBuffer(this.getWidth(),this.getHeight());...
// (略) //最初の描画要求なので初期化したいことがも...
}
// bufferGraphics.setColor( (略) //Graphics2Dのイン...
// bufferGraphics.setStroke( (略) //setSctokeで太さな...
bufferGraphics.drawLine(x1, y1, x2, y2); // バッファに...
repaint();//再描画するためpaintComponentを呼び出す。
//repaintメソッドは親Classで定義されているがpaintCompo...
}
// (略)
// repaintメソッドがpaintComponentを呼ぶので、バッファを...
public void paintComponent(Graphics g) {
super.paintComponent(g);//他に描画するものがあるかもし...
if(null!=bufferImage) g.drawImage(bufferImage, 0,0,thi...
}
// (略)
}
この例では、ウィンドウの大きさのバッファを作っています。...
最低限でもここまでの内容を完成して、提出してください。
*以下は、応用編です [#c56aa808]
以下のテーマに挑戦してください。
ここより先の機能が実現できていれば成績に加算いたします.
**JPEGファイル(写真)などを表示してこれにお絵描きする [#...
ImageIOというクラスのクラスメソッドreadを使うと,JPEGやGI...
以下のopenFileメソッドでは,引数のFile型インスタンスで指...
これを上記のSimpleDrawのインスタンスの中で呼び出すために...
panel.openFile(new File("sample.jpg"));
というようにします。こうするとこのプログラムが置かれた場...
public class DrawPanel extends JPanel {
// (略)
BufferedImage bufferImage=null;
Graphics2D bufferGraphics=null;
// (略)
private void createBuffer(int width, int height) {
//バッファ用のImageとGraphicsを用意する
bufferImage = new BufferedImage(width, height,Buffered...
bufferGraphics=bufferImage.createGraphics(); //getGrap...
bufferGraphics.setBackground(Color.white);
}
// (略)
public void openFile(File file2open){
BufferedImage pictureImage;
try {
pictureImage = ImageIO.read(file2open);
} catch(Exception e){
System.out.println("Error: reading file="+file2open.g...
return;
}
//画像に合わせたサイズでbufferImageとbufferGraphicsを...
//ImageIO.readの戻り値をbufferImageに代入するのでは駄...
this.createBuffer(pictureImage.getWidth(),pictureImage...
bufferGraphics.drawImage(pictureImage,0,0,this);
repaint(); //画像を表示するためにpaintComponentを呼ぶ
}
// (略)
}
**お絵描きした内容をJPEGファイルとして保存する [#o677b605]
これもImageIOというクラスのクラスメソッドwriteを使います...
以下のsaveFileメソッドでは,引数のFile型インスタンスで指...
public class DrawPanel extends JPanel {
// (略)
BufferedImage bufferImage=null;
// (略)
public void saveFile(File file2save) {
try {
ImageIO.write(bufferImage, "jpg", file2save);
} catch (Exception e) {
System.out.println("Error: writing file="+file2save.g...
return;
}
}
// (略)
}
**読み込むファイル/書き込むファイルをダイアログパネルで...
JFileChooserを使うと、読み込み/書き込みファイルの指定の...
ipublic class SimpleDraw extends JFrame implements Actio...
MouseListener, MouseMotionListener {
// (略)
DrawPanel panel;
JFileChooser fileChooser;
// (略)
public void actionPerformed(ActionEvent arg0) {
// (略)
else if(arg0.getActionCommand().equals("Open")) {
int returnVal = fileChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
panel.openFile(fileChooser.getSelectedFile());
}
}
else if(arg0.getActionCommand().equals("Save")) {
int returnVal = fileChooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
panel.saveFile(fileChooser.getSelectedFile());
}
}
// (略)
}
// (略)
//どこか最初に実行される場所
fileChooser = new JFileChooser();
//(略)
}
**このほかいろいろと機能を追加してみてください [#extra]
あとは工夫次第で便利な/面白い機能を追加してください。ど...
-便利な機能
--描画面全体を消して白紙にする機能
--領域を指定してコピーペースト移動等を行う機能
--描画中の内容を消さずに、その内容の任意の場所に、写真を...
--イメージを拡大縮小する機能
--指定した文字列が画像に書き込まれる機能
--指定した矩形を塗りつぶす/消す機能
--円や矩形や多角形を線で書く機能
-- 矩形や多角形を塗りつぶして書く機能
--大きな写真の場合、スクロールして閲覧/編集する機能
--絵の任意の場所をクリックするとそこの色を取得してペンな...
-使いやすい工夫
--ペンの太さなどをスライダで指定する機能
--現在の色、ペン太さ、フォント種類、描画モード(手書きか...
--市販のお絵かきプログラムにあるような、別ウィンドウでペ...
http://gyazo.com/e494357afb0d024c38d19c470e5493e5.png
http://gyazo.com/424f8502af49121709bdc994a2684592.png
http://gyazo.com/86935ab91636a836d7c2bc06dde675b7.png
-おもしろい(かもしれない)機能
--適当な小さなイメージを指定するとそれがスタンプになって...
--画面中央を境に、いつでも左右対称に描画される機能。もし...
--ドラッグさせて描いているとどんどん色が変わっていく虹色...
--指定された文字列がマウスのドラッグに従って書かれて行く...
#ref(textpen.png);
**先輩が作った優秀作品紹介 [#b13097a9]
添付の2007.zip, 2008.zip, 2009.zip, 2010sample.zipに,200...
//** 2006年度の先輩が作った優秀作品紹介 [#ae3ed1eb]
//
//添付のdraw.jarとdraw2.jarを試してみてください。draw.jar...
//draw2.jarはすこしバグがあるようで止まってしまうことがあ...
**先輩が作った優秀な取扱説明書 [#xef7c661]
-http://is.ocha.ac.jp/~siio/pdf/2013/manual1.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual2.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual3.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual4.pdf
-http://is.ocha.ac.jp/~siio/pdf/2013/manual5.pdf
------
このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。
ページ名: