LectureMMP08
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Lecture]]
*Java プログラミング入門 [#kd7c750b]
このページは、学部2年生向け授業である、「マルチメディア...
のために用意しました。
(Wikiの仕様で大文字小文字が混在した英単語に疑問符?が追...
***マウスイベント [#cc8c3961]
マウスイベントを受け取るには、Mouse ListenerやMouse Motio...
以下のようにするとイベントをうけとれるます。
まずはMouse Motion Listenerを試してみましょう。
マニュアル
- https://docs.oracle.com/javase/jp/8/docs/api/java/awt/e...
によると、実装しないといけないメソッドはmouse Draggedとmo...
- void mouseDragged(MouseEvent e)
コンポーネント上でマウス・ボタンを押してドラッグすると呼...
- void mouseMoved(MouseEvent e)
ボタンを押さずにマウス・カーソルをコンポーネント上に移動...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseMo...
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
次に、Mouse Listenerも実装してみましょう。マニュアル
- https://docs.oracle.com/javase/jp/7/api/java/awt/event/...
によると、
- void mouseClicked(MouseEvent e)
コンポーネント上でマウスボタンをクリック (押してから離す)...
- void mouseEntered(MouseEvent e)
コンポーネントにマウスが入ると呼び出されます。
- void mouseExited(MouseEvent e)
コンポーネントからマウスが出ると呼び出されます。
- void mousePressed(MouseEvent e)
コンポーネント上でマウスボタンが押されると呼び出されます。
- void mouseReleased(MouseEvent e)
コンポーネント上でマウスボタンが離されると呼び出されます。
これを追加します。宣言で
public class MouseTest extends JFrame implements MouseLi...
として、またmainに
test.addMouseListener(test);
を追加します。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
MouseEventのマニュアルを見てみましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
マウスイベントが発生した時のマウスの座標を知ることもでき...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged to " + e.getX() + "...
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
***サウンドファイルを再生する [#g86f7ead]
-以下のファイルをダウンロードしてください。
http://is.ocha.ac.jp/~siio/lecture/Sounds/Ping.aiff
(他にも、Basso.aiff Frog.aiff Hero.aiff Pop.aiff Submarin...
Blow.aiff Funk.aiff Morse.aiff Purr.aiff Tink.aiff
Bottle.aiff Glass.aiff Ping.aiff Sosumi.aiff
を置いておきました)
これを再生するプログラムを作ってみましょう。以下で再生で...
import java.io.File;
import javax.sound.sampled.*;
public class AudioInputStreamExample {
public static void main(String[] args) {
try {
File file = new File("Ping.aiff");
AudioInputStream stream = AudioSystem.getAudioInpu...
Clip clip = AudioSystem.getClip();
clip.open(stream);
clip.start();
// sleep to allow enough time for the clip to play
Thread.sleep(500);
stream.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
//(以下のプログラムは2015年以降のバージョンで音が出なかっ...
//
// import java.io.*;
// import javax.sound.sampled.*;
//
// public class AudioPlay {
// public static void main(String[] args) {
// try{
// File audioFile = new File("Ping.aiff");
// AudioFormat format = AudioSystem.getAudio...
// DataLine.Info info = new DataLine.Info(Cli...
// Clip clip = (Clip)AudioSystem.getLine(inf...
//
// clip.open(AudioSystem.getAudioInputStream(audio...
// clip.start();
// clip.drain();
// clip.close();
// }
// catch(Exception e){
// e.printStackTrace();
// }
// }
// }
***他の環境でのGUIプログラミングの例 [#r2f2f8d0]
***X11 [#dd5927c8]
以下の内容の新しいファイル,buttontest.cを作ってください.
printfの逆スラッシュが正しくコピペできてないかもしれない...
入力が面倒なら,添付ファイルの
[[buttontest.c:http://is.ocha.ac.jp/~siio/index.php?plugi...
をダウンロードしてください.
#include <X11/Xlib.h>
#include <stdio.h>
int main (){
Display *display = XOpenDisplay (NULL);
XEvent event;
Window window = XCreateSimpleWindow(display, DefaultRoo...
XSelectInput(display,window,KeyPressMask | ButtonPressM...
XMapWindow(display, window);
XFlush(display);
while(1) {
XNextEvent(display,&event);
switch (event.type) {
case KeyPress:
printf("key\n");
break;
case ButtonPress:
printf("button down\n");
printf("button\n");
break;
case ButtonRelease:
printf("button up\n");
break;
}
}
return 0;
}
以下のコマンドでコンパイルしてください.
cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -l...
出来上がったファイルを,./a.outで実行してください.
***Mac OS X [#nf4b4468]
How2MacOSXProgramming を見てください
***iPhone [#f0103cac]
How2iPhoneProgramming を見てください
*** 簡単なアニメーション [#z5939b7b]
-まずはなにもしないウィンドウを出します
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class SimpleAnime extends JFrame {
private void init() {
this.setTitle("SimpleAnime");
this.setSize(300,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
}
}
-次に動くボールを出します
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class SimpleAnime extends JFrame {
JPanel panel;
Graphics g;
private void init() {
this.setTitle("SimpleAnime");
this.setSize(300,200);
panel = new JPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g=panel.getGraphics();
g.setColor(Color.blue);
int x=0, xdelta=10;
while(true) {
g.fillOval(x,80,50,50);
try{Thread.sleep(50);}catch(Exception e){}
g.clearRect(x, 80, 52,52);
x+=xdelta;
if(x>250) xdelta=-10;
if(x<0) xdelta=10;
}
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
}
}
http://gyazo.com/12d1f047af8d4f87f7199c8a7db66080.png
-マルチスレッド化する
上記のプログラムでは、main()で、frame.init()したあと、こ...
アニメーションだけをするなら、これでも良いのですが、他に...
以下のように、別のインスタンスを別スレッドで動かします。...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;
class Animator implements Runnable {
Graphics g;
public void setGraphics(Graphics animeG) {
g=animeG;
}
public void run() {
int x=0, xdelta=10;
while(true) {
g.fillOval(x,80,50,50);
try{Thread.sleep(50);}catch(Exception e){}
g.clearRect(x, 80, 52,52);
x+=xdelta;
if(x>250) xdelta=-10;
if(x<0) xdelta=10;
}
}
}
class SimpleAnime extends JFrame {
JPanel panel;
Graphics g;
Animator animator;
private void init() {
animator=new Animator();
this.setTitle("SimpleAnime");
this.setSize(300,200);
panel = new JPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g=panel.getGraphics();
g.setColor(Color.blue);
animator.setGraphics(g);
new Thread(animator).start();
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
for(int i=0;;i++) {
System.out.println(i);
try {Thread.sleep(500);}catch(Exception e){}
}
}
}
-アニメーションボールの設定ができるアプリケーションを作っ...
こういうのを作ってほしい
http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=o...
ヒント:上のアニメーションのプログラムに、メニューを取り...
action Performedでメニューからのイベントを受け取れば良い...
メニューの動きは、プログラム本来の動きと並列に動いてくれ...
上のアニメーションのようなアニメーション以外何もできない...
メニューは動いてくれます。
ヒント: action Performed ではこうしたら良い
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command=="red") g.setColor(Color.red);
if(command=="blue") g.setColor(Color.blue);
-余力があれば、ボールが当たったら音が出るようにしてみよう。
ヒント:メニューはSimple Animeでつくって、action listener...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;
class Animator implements Runnable, ActionListener {
略
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command !=null) {
System.out.println(command);
}
if(command=="red") g.setColor(Color.red);
if(command=="blue") g.setColor(Color.blue);
if(command=="yellow") g.setColor(Color.yellow);
if(command=="fast") xdelta=30;
if(command=="slow") xdelta=5;
}
略
}
class SimpleAnime extends JFrame {
略
private void makeMenu() {
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("color");
JMenu menuSpeed = new JMenu("speed");
JMenuItem item1 = new JMenuItem("red");
item1.addActionListener(animator);
item1.setActionCommand("red");
JMenuItem item2 = new JMenuItem("blue");
item2.addActionListener(animator);
item2.setActionCommand("blue");
JMenuItem item3 = new JMenuItem("yellow");
item3.addActionListener(animator);
item3.setActionCommand("yellow");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem item4 = new JMenuItem("fast");
item4.addActionListener(animator);
item4.setActionCommand("fast");
JMenuItem item5 = new JMenuItem("slow");
item5.addActionListener(animator);
item5.setActionCommand("slow");
menuSpeed.add(item4);
menuSpeed.add(item5);
menubar.add(menu);
menubar.add(menuSpeed);
this.setJMenuBar(menubar);
}
略
}
-ボールの色と早さをメニューで指定する(解答編)
上記のプログラムにメニューを追加して、
ボールの色と速さをメニューで指定するようにしました。
メニューはメインのJFrameインスタンスで作ってこれに貼りつ...
Action Listenerは、別スレッドで動いているAnimatorクラスの...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;
class Animator implements Runnable, ActionListener {
Graphics g;
int xdelta =5;
public void setGraphics(Graphics animeG) {
g=animeG;
}
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command !=null) {
System.out.println(command);
}
if(command=="red") g.setColor(Color.red);
if(command=="blue") g.setColor(Color.blue);
if(command=="yellow") g.setColor(Color.yellow);
if(command=="fast") xdelta=30;
if(command=="slow") xdelta=5;
}
public void run() {
int x=0;
while(true) {
g.fillOval(x,80,50,50);
try{Thread.sleep(50);}catch(Exception e){}
g.clearRect(x, 80, 52,52);
x+=xdelta;
if(x>250) xdelta=-xdelta;
if(x<0) xdelta=-xdelta;
}
}
}
class SimpleAnime extends JFrame {
JPanel panel;
Graphics g;
Animator animator;
private void makeMenu() {
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("color");
JMenu menuSpeed = new JMenu("speed");
JMenuItem item1 = new JMenuItem("red");
item1.addActionListener(animator);
item1.setActionCommand("red");
JMenuItem item2 = new JMenuItem("blue");
item2.addActionListener(animator);
item2.setActionCommand("blue");
JMenuItem item3 = new JMenuItem("yellow");
item3.addActionListener(animator);
item3.setActionCommand("yellow");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem item4 = new JMenuItem("fast");
item4.addActionListener(animator);
item4.setActionCommand("fast");
JMenuItem item5 = new JMenuItem("slow");
item5.addActionListener(animator);
item5.setActionCommand("slow");
menuSpeed.add(item4);
menuSpeed.add(item5);
menubar.add(menu);
menubar.add(menuSpeed);
this.setJMenuBar(menubar);
}
private void init() {
animator = new Animator();
this.setTitle("SimpleAnime");
this.setSize(300,200);
this.makeMenu();
panel = new JPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g=panel.getGraphics();
g.setColor(Color.blue);
animator.setGraphics(g);
new Thread(animator).start();
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
for(int i=0;;i++) {
System.out.println(i);
try {Thread.sleep(500);}catch(Exception e){}
}
}
}
http://gyazo.com/d5db8ca6fa153520e94ee7d2b7a93915.png
-この先改良すべきこと [#u99ec852]
アニメーションの途中で、ボールがちらつくことがあります。
ボールの場所を矩形で消して、新しいボールを描いているので、
その途中の作業が見えてしまうからです。
これを無くすには、ダブルバッファの手法を用います。
すなわち、描画する面をもう一枚用意して、
そちらに描画し、
描画が終わったところで、一気に更新する方法です。
ダブルバッファの手法は、授業の最終課題である「お絵かきプ...
*** 線を引く簡単なプログラム [#y4c3a992]
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();
}
}
***Java Appletの作り方 [#h726edf9]
いままでは、Java Applicationを作ってました。
これはjavaコマンドから実行するアプリケーションでした。
このほか、Javaには、Java Appletという実行形式式があります。
Appletは、webページなどで動かすことができます。
もともとは、webサービスでクライアント側でアプリケーション...
開発されました。
AppletはAppletクラスを継承して作ります。
Appletクラスは、java.awt.Panelを継承しています。
なにができるのかは、java のマニュアルをみてください。
たとえば、次のようなプログラムをAppletTest.javaとして作り...
これをコンパイルします。
import java.awt.*;
import java.applet.*;
public class AppletTest extends Applet {
public void paint(Graphics g) {
g.drawString("Hello World!!", 60, 30);
}
}
これはhtmlの中から呼び出すことができます。
たとえば、つぎのような、index.htmlをつくります。
<html>
<head><title>Applet Test</title></head>
<body>
<applet code="AppletTest.class" width="300" height="150">
</applet>
</body>
</html>
これを、さきほどコンパイルしたclassと同じディレクトリにお...
webブラウザで開くと、java appletのプログラムが動きます。
http://gyazo.com/637225a1c08bef7e853944ad9b8ed390.png
または、このhtmlファイルをアップレットビューアでみること...
appletviewer index.html
などして動作を確認できます。
http://gyazo.com/d8174aace858dc50e603ee0fef62bcf7.png
つぎのようにすれば、上の先の例で示す、お絵描きプログラム...
init()は、起動したときに最初に一度だけ呼び出されるメソッ...
import java.awt.*;
import java.applet.*;
import java.awt.event.MouseMotionListener;
import java.awt.event.*;
public class AppletTest extends Applet implements MouseM...
int lastx,lasty,newx,newy;
Graphics g;
public void mouseMoved(MouseEvent arg0) {
}
public void mouseDragged(MouseEvent arg0) {
newx=arg0.getX();
newy=arg0.getY();
g.drawLine(lastx,lasty,newx,newy);
lastx=newx;
lasty=newy;
}
public void paint(Graphics g) {
g.drawString("Hello World!!", 60, 30);
}
public void init() {
g=this.getGraphics();
this.addMouseMotionListener(this);
}
}
appletviewerで見てみます。
http://gyazo.com/2c88f97c8f7234e5e3eb72dcd9b2713a.png
webブラウザでもみてみましょう。
(注意:Safariでは、読み込まれたappletが残っていますので、
更新したappletを試すためには、
Safariを一旦終了して起動しなおしてください。)
http://gyazo.com/143be91363a277f04a0fa8b1f5d5a43a.png
webサーバにおけば、世界中から使うこともできます。以下をク...
//以下の例では、次に述べる一筆書き問題は解消されています。
http://is.ocha.ac.jp/~siio/lecture/applet/
//***今日の課題
//
//上で紹介したappletを、一筆書きにならないように変更して...
//やりかたは、前回やったお絵かきプログラムの改良と同じで...
////本日までにできたところ(.java、.classファイルなど)を、
//完成したら、.html, .java、.classファイルを、
//いつものように、出席番号+名前のフォルダに入れて、
//zipで圧縮して、
//ファイルサーバから提出してください。
***Eclipseを使ってみよう [#vf7b5de5]
http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png
-Eclipseの警告を消す方法
private static final long serialVersionUID = 42L;
という変数を定義しておきます。
-----------------------------------------------
*マルチメディアプログラミングの最終課題 [#fa431919]
-課題:お絵描きプログラムを作成してさらに取扱説明書を作成...
--この課題のヒントは SimpleDraw をみてください。
** 提出課題として最低やってほしいこと [#hd791dc3]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにして...
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)
** 機能拡張:以下のことができれば加点します [#ibf935ab]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文...
-絵をファイルへ書き出す機能を作る
-他の絵データをスタンプのように押す機能
-コピーアンドペースト
-メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(...
-そのほか、世の中のお絵描きプログラムにありそうな機能を実...
機能拡張の詳細はSimpleDrawの
-http://is.ocha.ac.jp/~siio/index.php?SimpleDraw#extra
を見てください。SimpleDrawのページでは、
-機能の拡充
-使いやすさの追求
の2通りの拡張を書いてあります。どちらの方針で進めていただ...
説明書に、工夫したところを書いておいてください。
** 取扱説明書の作り方 [#j3398d0e]
-ApplicationsからMicrosoft Office 2011/Microsoft Wordもし...
-せっかくですので作った機能はぜんぶここで説明してください...
-スクリーンキャプチャした図も入れてください。図は次のよう...
--スクリーンキャプチャしたいところで、コマンド(リンゴマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さ...
--以上の操作で、デスクトップにピクチャファイルができます...
--もしくは、デスクトップのピクチャファイルをダブルクリッ...
-Control キーを押しながらキーボードショートカットを押すと...
-がんばったところ、大変だったところなどを書いていただいて...
** 出来上がったプログラムの提出方法 [#i421b017]
- フォルダを作ってその中にjavaファイルとclassファイルと、...
-このフォルダに名前を付けてください。フォルダの名前は、「...
-このフォルダを圧縮してください
-このフォルダを圧縮してください
-圧縮したファイルを
/home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動...
以下のように入力して、移動ボタンを押して、そこに現れるド...
http://is.ocha.ac.jp/~siio/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味の...
-レポート提出用フォルダは書き込み専用で見ることができませ...
-同じ名前のフォルダを投げ込むと、エラーになります。という...
** 締切 [#sc18de64]
-締め切りは1月30日11:59pmとします
--この日までに提出してください
//--どうしてもそのあともがんばりたい人は1月31日の11:59pm...
//--可能な限り差し替えます(見落とす可能性がありますので...
**昨年度の優秀作品例 [#t2007b9e]
-http://is.ocha.ac.jp/~siio/pdf/2019/sample2018_1.pdf
-http://is.ocha.ac.jp/~siio/pdf/2019/sample2018_2.pdf
-http://is.ocha.ac.jp/~siio/pdf/2019/sample2018_3.pdf
**2013年度の優秀作品例 [#t2007b9e]
-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
----------------
///////////////////////////////////////////////
終了行:
[[Lecture]]
*Java プログラミング入門 [#kd7c750b]
このページは、学部2年生向け授業である、「マルチメディア...
のために用意しました。
(Wikiの仕様で大文字小文字が混在した英単語に疑問符?が追...
***マウスイベント [#cc8c3961]
マウスイベントを受け取るには、Mouse ListenerやMouse Motio...
以下のようにするとイベントをうけとれるます。
まずはMouse Motion Listenerを試してみましょう。
マニュアル
- https://docs.oracle.com/javase/jp/8/docs/api/java/awt/e...
によると、実装しないといけないメソッドはmouse Draggedとmo...
- void mouseDragged(MouseEvent e)
コンポーネント上でマウス・ボタンを押してドラッグすると呼...
- void mouseMoved(MouseEvent e)
ボタンを押さずにマウス・カーソルをコンポーネント上に移動...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseMo...
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
次に、Mouse Listenerも実装してみましょう。マニュアル
- https://docs.oracle.com/javase/jp/7/api/java/awt/event/...
によると、
- void mouseClicked(MouseEvent e)
コンポーネント上でマウスボタンをクリック (押してから離す)...
- void mouseEntered(MouseEvent e)
コンポーネントにマウスが入ると呼び出されます。
- void mouseExited(MouseEvent e)
コンポーネントからマウスが出ると呼び出されます。
- void mousePressed(MouseEvent e)
コンポーネント上でマウスボタンが押されると呼び出されます。
- void mouseReleased(MouseEvent e)
コンポーネント上でマウスボタンが離されると呼び出されます。
これを追加します。宣言で
public class MouseTest extends JFrame implements MouseLi...
として、またmainに
test.addMouseListener(test);
を追加します。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
MouseEventのマニュアルを見てみましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
マウスイベントが発生した時のマウスの座標を知ることもでき...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged to " + e.getX() + "...
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
***サウンドファイルを再生する [#g86f7ead]
-以下のファイルをダウンロードしてください。
http://is.ocha.ac.jp/~siio/lecture/Sounds/Ping.aiff
(他にも、Basso.aiff Frog.aiff Hero.aiff Pop.aiff Submarin...
Blow.aiff Funk.aiff Morse.aiff Purr.aiff Tink.aiff
Bottle.aiff Glass.aiff Ping.aiff Sosumi.aiff
を置いておきました)
これを再生するプログラムを作ってみましょう。以下で再生で...
import java.io.File;
import javax.sound.sampled.*;
public class AudioInputStreamExample {
public static void main(String[] args) {
try {
File file = new File("Ping.aiff");
AudioInputStream stream = AudioSystem.getAudioInpu...
Clip clip = AudioSystem.getClip();
clip.open(stream);
clip.start();
// sleep to allow enough time for the clip to play
Thread.sleep(500);
stream.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
//(以下のプログラムは2015年以降のバージョンで音が出なかっ...
//
// import java.io.*;
// import javax.sound.sampled.*;
//
// public class AudioPlay {
// public static void main(String[] args) {
// try{
// File audioFile = new File("Ping.aiff");
// AudioFormat format = AudioSystem.getAudio...
// DataLine.Info info = new DataLine.Info(Cli...
// Clip clip = (Clip)AudioSystem.getLine(inf...
//
// clip.open(AudioSystem.getAudioInputStream(audio...
// clip.start();
// clip.drain();
// clip.close();
// }
// catch(Exception e){
// e.printStackTrace();
// }
// }
// }
***他の環境でのGUIプログラミングの例 [#r2f2f8d0]
***X11 [#dd5927c8]
以下の内容の新しいファイル,buttontest.cを作ってください.
printfの逆スラッシュが正しくコピペできてないかもしれない...
入力が面倒なら,添付ファイルの
[[buttontest.c:http://is.ocha.ac.jp/~siio/index.php?plugi...
をダウンロードしてください.
#include <X11/Xlib.h>
#include <stdio.h>
int main (){
Display *display = XOpenDisplay (NULL);
XEvent event;
Window window = XCreateSimpleWindow(display, DefaultRoo...
XSelectInput(display,window,KeyPressMask | ButtonPressM...
XMapWindow(display, window);
XFlush(display);
while(1) {
XNextEvent(display,&event);
switch (event.type) {
case KeyPress:
printf("key\n");
break;
case ButtonPress:
printf("button down\n");
printf("button\n");
break;
case ButtonRelease:
printf("button up\n");
break;
}
}
return 0;
}
以下のコマンドでコンパイルしてください.
cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -l...
出来上がったファイルを,./a.outで実行してください.
***Mac OS X [#nf4b4468]
How2MacOSXProgramming を見てください
***iPhone [#f0103cac]
How2iPhoneProgramming を見てください
*** 簡単なアニメーション [#z5939b7b]
-まずはなにもしないウィンドウを出します
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class SimpleAnime extends JFrame {
private void init() {
this.setTitle("SimpleAnime");
this.setSize(300,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
}
}
-次に動くボールを出します
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class SimpleAnime extends JFrame {
JPanel panel;
Graphics g;
private void init() {
this.setTitle("SimpleAnime");
this.setSize(300,200);
panel = new JPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g=panel.getGraphics();
g.setColor(Color.blue);
int x=0, xdelta=10;
while(true) {
g.fillOval(x,80,50,50);
try{Thread.sleep(50);}catch(Exception e){}
g.clearRect(x, 80, 52,52);
x+=xdelta;
if(x>250) xdelta=-10;
if(x<0) xdelta=10;
}
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
}
}
http://gyazo.com/12d1f047af8d4f87f7199c8a7db66080.png
-マルチスレッド化する
上記のプログラムでは、main()で、frame.init()したあと、こ...
アニメーションだけをするなら、これでも良いのですが、他に...
以下のように、別のインスタンスを別スレッドで動かします。...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;
class Animator implements Runnable {
Graphics g;
public void setGraphics(Graphics animeG) {
g=animeG;
}
public void run() {
int x=0, xdelta=10;
while(true) {
g.fillOval(x,80,50,50);
try{Thread.sleep(50);}catch(Exception e){}
g.clearRect(x, 80, 52,52);
x+=xdelta;
if(x>250) xdelta=-10;
if(x<0) xdelta=10;
}
}
}
class SimpleAnime extends JFrame {
JPanel panel;
Graphics g;
Animator animator;
private void init() {
animator=new Animator();
this.setTitle("SimpleAnime");
this.setSize(300,200);
panel = new JPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g=panel.getGraphics();
g.setColor(Color.blue);
animator.setGraphics(g);
new Thread(animator).start();
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
for(int i=0;;i++) {
System.out.println(i);
try {Thread.sleep(500);}catch(Exception e){}
}
}
}
-アニメーションボールの設定ができるアプリケーションを作っ...
こういうのを作ってほしい
http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=o...
ヒント:上のアニメーションのプログラムに、メニューを取り...
action Performedでメニューからのイベントを受け取れば良い...
メニューの動きは、プログラム本来の動きと並列に動いてくれ...
上のアニメーションのようなアニメーション以外何もできない...
メニューは動いてくれます。
ヒント: action Performed ではこうしたら良い
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command=="red") g.setColor(Color.red);
if(command=="blue") g.setColor(Color.blue);
-余力があれば、ボールが当たったら音が出るようにしてみよう。
ヒント:メニューはSimple Animeでつくって、action listener...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;
class Animator implements Runnable, ActionListener {
略
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command !=null) {
System.out.println(command);
}
if(command=="red") g.setColor(Color.red);
if(command=="blue") g.setColor(Color.blue);
if(command=="yellow") g.setColor(Color.yellow);
if(command=="fast") xdelta=30;
if(command=="slow") xdelta=5;
}
略
}
class SimpleAnime extends JFrame {
略
private void makeMenu() {
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("color");
JMenu menuSpeed = new JMenu("speed");
JMenuItem item1 = new JMenuItem("red");
item1.addActionListener(animator);
item1.setActionCommand("red");
JMenuItem item2 = new JMenuItem("blue");
item2.addActionListener(animator);
item2.setActionCommand("blue");
JMenuItem item3 = new JMenuItem("yellow");
item3.addActionListener(animator);
item3.setActionCommand("yellow");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem item4 = new JMenuItem("fast");
item4.addActionListener(animator);
item4.setActionCommand("fast");
JMenuItem item5 = new JMenuItem("slow");
item5.addActionListener(animator);
item5.setActionCommand("slow");
menuSpeed.add(item4);
menuSpeed.add(item5);
menubar.add(menu);
menubar.add(menuSpeed);
this.setJMenuBar(menubar);
}
略
}
-ボールの色と早さをメニューで指定する(解答編)
上記のプログラムにメニューを追加して、
ボールの色と速さをメニューで指定するようにしました。
メニューはメインのJFrameインスタンスで作ってこれに貼りつ...
Action Listenerは、別スレッドで動いているAnimatorクラスの...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;
class Animator implements Runnable, ActionListener {
Graphics g;
int xdelta =5;
public void setGraphics(Graphics animeG) {
g=animeG;
}
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command !=null) {
System.out.println(command);
}
if(command=="red") g.setColor(Color.red);
if(command=="blue") g.setColor(Color.blue);
if(command=="yellow") g.setColor(Color.yellow);
if(command=="fast") xdelta=30;
if(command=="slow") xdelta=5;
}
public void run() {
int x=0;
while(true) {
g.fillOval(x,80,50,50);
try{Thread.sleep(50);}catch(Exception e){}
g.clearRect(x, 80, 52,52);
x+=xdelta;
if(x>250) xdelta=-xdelta;
if(x<0) xdelta=-xdelta;
}
}
}
class SimpleAnime extends JFrame {
JPanel panel;
Graphics g;
Animator animator;
private void makeMenu() {
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("color");
JMenu menuSpeed = new JMenu("speed");
JMenuItem item1 = new JMenuItem("red");
item1.addActionListener(animator);
item1.setActionCommand("red");
JMenuItem item2 = new JMenuItem("blue");
item2.addActionListener(animator);
item2.setActionCommand("blue");
JMenuItem item3 = new JMenuItem("yellow");
item3.addActionListener(animator);
item3.setActionCommand("yellow");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem item4 = new JMenuItem("fast");
item4.addActionListener(animator);
item4.setActionCommand("fast");
JMenuItem item5 = new JMenuItem("slow");
item5.addActionListener(animator);
item5.setActionCommand("slow");
menuSpeed.add(item4);
menuSpeed.add(item5);
menubar.add(menu);
menubar.add(menuSpeed);
this.setJMenuBar(menubar);
}
private void init() {
animator = new Animator();
this.setTitle("SimpleAnime");
this.setSize(300,200);
this.makeMenu();
panel = new JPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g=panel.getGraphics();
g.setColor(Color.blue);
animator.setGraphics(g);
new Thread(animator).start();
}
public static void main(String[] args) {
SimpleAnime frame = new SimpleAnime();
frame.init();
for(int i=0;;i++) {
System.out.println(i);
try {Thread.sleep(500);}catch(Exception e){}
}
}
}
http://gyazo.com/d5db8ca6fa153520e94ee7d2b7a93915.png
-この先改良すべきこと [#u99ec852]
アニメーションの途中で、ボールがちらつくことがあります。
ボールの場所を矩形で消して、新しいボールを描いているので、
その途中の作業が見えてしまうからです。
これを無くすには、ダブルバッファの手法を用います。
すなわち、描画する面をもう一枚用意して、
そちらに描画し、
描画が終わったところで、一気に更新する方法です。
ダブルバッファの手法は、授業の最終課題である「お絵かきプ...
*** 線を引く簡単なプログラム [#y4c3a992]
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();
}
}
***Java Appletの作り方 [#h726edf9]
いままでは、Java Applicationを作ってました。
これはjavaコマンドから実行するアプリケーションでした。
このほか、Javaには、Java Appletという実行形式式があります。
Appletは、webページなどで動かすことができます。
もともとは、webサービスでクライアント側でアプリケーション...
開発されました。
AppletはAppletクラスを継承して作ります。
Appletクラスは、java.awt.Panelを継承しています。
なにができるのかは、java のマニュアルをみてください。
たとえば、次のようなプログラムをAppletTest.javaとして作り...
これをコンパイルします。
import java.awt.*;
import java.applet.*;
public class AppletTest extends Applet {
public void paint(Graphics g) {
g.drawString("Hello World!!", 60, 30);
}
}
これはhtmlの中から呼び出すことができます。
たとえば、つぎのような、index.htmlをつくります。
<html>
<head><title>Applet Test</title></head>
<body>
<applet code="AppletTest.class" width="300" height="150">
</applet>
</body>
</html>
これを、さきほどコンパイルしたclassと同じディレクトリにお...
webブラウザで開くと、java appletのプログラムが動きます。
http://gyazo.com/637225a1c08bef7e853944ad9b8ed390.png
または、このhtmlファイルをアップレットビューアでみること...
appletviewer index.html
などして動作を確認できます。
http://gyazo.com/d8174aace858dc50e603ee0fef62bcf7.png
つぎのようにすれば、上の先の例で示す、お絵描きプログラム...
init()は、起動したときに最初に一度だけ呼び出されるメソッ...
import java.awt.*;
import java.applet.*;
import java.awt.event.MouseMotionListener;
import java.awt.event.*;
public class AppletTest extends Applet implements MouseM...
int lastx,lasty,newx,newy;
Graphics g;
public void mouseMoved(MouseEvent arg0) {
}
public void mouseDragged(MouseEvent arg0) {
newx=arg0.getX();
newy=arg0.getY();
g.drawLine(lastx,lasty,newx,newy);
lastx=newx;
lasty=newy;
}
public void paint(Graphics g) {
g.drawString("Hello World!!", 60, 30);
}
public void init() {
g=this.getGraphics();
this.addMouseMotionListener(this);
}
}
appletviewerで見てみます。
http://gyazo.com/2c88f97c8f7234e5e3eb72dcd9b2713a.png
webブラウザでもみてみましょう。
(注意:Safariでは、読み込まれたappletが残っていますので、
更新したappletを試すためには、
Safariを一旦終了して起動しなおしてください。)
http://gyazo.com/143be91363a277f04a0fa8b1f5d5a43a.png
webサーバにおけば、世界中から使うこともできます。以下をク...
//以下の例では、次に述べる一筆書き問題は解消されています。
http://is.ocha.ac.jp/~siio/lecture/applet/
//***今日の課題
//
//上で紹介したappletを、一筆書きにならないように変更して...
//やりかたは、前回やったお絵かきプログラムの改良と同じで...
////本日までにできたところ(.java、.classファイルなど)を、
//完成したら、.html, .java、.classファイルを、
//いつものように、出席番号+名前のフォルダに入れて、
//zipで圧縮して、
//ファイルサーバから提出してください。
***Eclipseを使ってみよう [#vf7b5de5]
http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png
-Eclipseの警告を消す方法
private static final long serialVersionUID = 42L;
という変数を定義しておきます。
-----------------------------------------------
*マルチメディアプログラミングの最終課題 [#fa431919]
-課題:お絵描きプログラムを作成してさらに取扱説明書を作成...
--この課題のヒントは SimpleDraw をみてください。
** 提出課題として最低やってほしいこと [#hd791dc3]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにして...
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)
** 機能拡張:以下のことができれば加点します [#ibf935ab]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文...
-絵をファイルへ書き出す機能を作る
-他の絵データをスタンプのように押す機能
-コピーアンドペースト
-メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(...
-そのほか、世の中のお絵描きプログラムにありそうな機能を実...
機能拡張の詳細はSimpleDrawの
-http://is.ocha.ac.jp/~siio/index.php?SimpleDraw#extra
を見てください。SimpleDrawのページでは、
-機能の拡充
-使いやすさの追求
の2通りの拡張を書いてあります。どちらの方針で進めていただ...
説明書に、工夫したところを書いておいてください。
** 取扱説明書の作り方 [#j3398d0e]
-ApplicationsからMicrosoft Office 2011/Microsoft Wordもし...
-せっかくですので作った機能はぜんぶここで説明してください...
-スクリーンキャプチャした図も入れてください。図は次のよう...
--スクリーンキャプチャしたいところで、コマンド(リンゴマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さ...
--以上の操作で、デスクトップにピクチャファイルができます...
--もしくは、デスクトップのピクチャファイルをダブルクリッ...
-Control キーを押しながらキーボードショートカットを押すと...
-がんばったところ、大変だったところなどを書いていただいて...
** 出来上がったプログラムの提出方法 [#i421b017]
- フォルダを作ってその中にjavaファイルとclassファイルと、...
-このフォルダに名前を付けてください。フォルダの名前は、「...
-このフォルダを圧縮してください
-このフォルダを圧縮してください
-圧縮したファイルを
/home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動...
以下のように入力して、移動ボタンを押して、そこに現れるド...
http://is.ocha.ac.jp/~siio/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味の...
-レポート提出用フォルダは書き込み専用で見ることができませ...
-同じ名前のフォルダを投げ込むと、エラーになります。という...
** 締切 [#sc18de64]
-締め切りは1月30日11:59pmとします
--この日までに提出してください
//--どうしてもそのあともがんばりたい人は1月31日の11:59pm...
//--可能な限り差し替えます(見落とす可能性がありますので...
**昨年度の優秀作品例 [#t2007b9e]
-http://is.ocha.ac.jp/~siio/pdf/2019/sample2018_1.pdf
-http://is.ocha.ac.jp/~siio/pdf/2019/sample2018_2.pdf
-http://is.ocha.ac.jp/~siio/pdf/2019/sample2018_3.pdf
**2013年度の優秀作品例 [#t2007b9e]
-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
----------------
///////////////////////////////////////////////
ページ名: