プログラミング演習3 第3回 ミニプロジェクト.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Powerpoint 機能の使い方. 1.簡単な図の作成 例として植物個体の図を作成 (1)輪郭を大まかに描く まず、「オートシェイプ」 → 「線」 → 「曲 線」を選び、輪郭を適当に描く.
Ver 準備 Java フォルダに移動して …… mkdir Swing Swing フォルダに移動して …… cp ~gundam/Java/Swing. コマンドプロンプト ( JDK ) でないと起動 しないので注意!!!
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
初年次セミナー 第13回 2次元グラフィックス(1).
社会人学習講座 「Javaプログラミング概論」
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
GridLayout オブジェクト(省略)
図の挿入 ●方法1 ①図を挿入する位置にカーソルを置く。 ②「挿入」メニュー →「図」 → 「ファイルから」とクリックする。 ③挿入するファイルを選択し、「挿入」をクリックする。 ●方法2(書式までコピーされるので、ファイルサイズが大きくなる) ①挿入する図をコピーする。 ② 挿入する位置にカーソルを移動し、ツールバーまたは右クリックメニューの「貼り付け」をクリックする。
図の挿入 ●方法1 ①図を挿入する位置にカーソルを置く。 ②「挿入」タブ ⇒「図」 → 「ファイルから」とクリックする。 ③挿入するファイルを選択し、「挿入」をクリックする。 ●方法2(書式までコピーされるので、ファイルサイズが大きくなる) ①挿入する図をコピーする。 ② 挿入する位置にカーソルを移動し、ツールバーまたは右クリックメニューの「貼り付け」をクリックする。
         第9回 Swing.
F5 キーを押すか、または [スライド ショー] > [最初から] をクリックして、コースを開始してください。
Imageの描画 画像を読み込んで表示すること。 import java.awt.*;が必要。
Applet 岡部 祐典 鈴木 敬幸.
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習3 第4回 ミニプロジェクト.
第14回 GUIの構成とイベント・ドリブン ~GUIを使ったプログラム(Ⅰ)~.
アルゴリズムとプログラミング (Algorithms and Programming)
CGプログラミング論 平成28年4月27日 森田 彦.
システムエンジニアリング演習 GUIの実現(3):Swing 11月20日.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
第11回 GUI(グラフィカル・ユーザ・インターフェース)の設計
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
プログラミング演習3 第2回 GUIの復習.
基礎プログラミング演習 第10回.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
JAVA入門後期⑨ JAVAのSwingのメニュー処理
グラフィックス、その1 色の表示 フォントを変えて文字を表示 直線、四角形、楕円形の描画 円弧の描画 多角形の描画
プログラミング演習3 第3回 ミニプロジェクト.
JAVA入門後期⑩ 情報処理試験例題解説.
アルゴリズムとプログラミング (Algorithms and Programming)
JAVA入門後期⑦ JAVAのSwingの基本構造
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
情報処理 第8回.
第15回独習Javaゼミ セクション14~15 発表者 直江宗紀.
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
TCanvas BCB:TCanvasクラスでグラフィックを扱う。 TFormなどもプロパティとして持っている。
プログラミング演習3 第2回 GUIの復習.
演習1 : インターフェイスを使ってみよう 「10人の客(乗用車、バイク、ストーブのいずれかランダムに決定)に1~100(L)の給油をするガソリンスタンドをシミュレートする実行クラス : RefuelSimulation」を作成する。給油の際には、どの種類の客が何リットル給油したか出力すること。 実行結果例.
Java/Swingについて+ (4) 2005年10月26日 海谷 治彦.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラミング基礎a 第12回 Java言語による図形処理入門(3) アニメーション入門
プログラミング基礎a 第11回 Java言語による図形処理入門(3) アニメーション入門
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
第8回放送授業.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
JAVA GUIプログラミング 第3回 イベント処理① マウスイベント.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
C#プログラミング実習 第3回.
サブゼミ第7回 実装編① オブジェクト型とキャスト.
画面への描画 Graphics オブジェクト 紙 ペン Pen オブジェクト Brush オブジェクト 画面のピクセルをカプセル化
ソフトウェア制作論 平成30年11月28日.
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
5-5 文字列の描画 (1)基本的な文字列描画 A.手順
Presentation transcript:

プログラミング演習3 第3回 ミニプロジェクト

ミニプロジェクトについて 1週目では丸や三角形などの形状を用いて継承の復習、2週目ではボタンなどのレイアウトや図形の描画などGUIの復習をしました ミニプロジェクトでは、これら2つを組み合わせておえかきツールを作ってみましょう

完成図の例 図形選択パネル メニュー 描画パネル ボタンを選択 -> 選択された図形の描画準備 ボタンを選択 -> 選択された図形の描画準備 描画パネルをクリック -> 選択された図形をクリックされた 座標に描画

ミニプロジェクトの流れ Swingによる描画 描画クラスの定義 複合図形の描画 描画パネルと図形選択パネルの設計 ActionListenerの処理の記述 Graphicsクラスによる描画 描画クラスの定義 図形クラスの設計 描画用インターフェースの設計 複合図形の描画

描画パネルと図形選択パネルの設計 JPanelを継承したクラスを作り、実行クラス内で呼び出す class MainFrame extends JFrame{ ChoosePanel cp; DrawPanel dp; class ChoosePanel extends JPanel{ } class DrawPanel extends JPanel{

ActionListenerの処理の記述 イベントを発生させたいコンポーネントに リスナー(ボタンの場合はActionListener)を指定 イベントを発生した時に行う処理を書く ボタンによって処理を変えたい場合はgetSourceやgetActionCommandで場合分け

ボタンに貼る画像の作り方 まず図形クラスで、図形の大きさに合ったBufferedImageを作成しdrawメソッドで描いたものをImageとして返す サイズが(70,70)の空のイメージを作成し、そこにTreeを構成する要素を描く 作成する画像の横幅を返すメソッド 作成する画像の高さを返すメソッド ※Treeクラスについてはスライド23,24を参考にすること

ボタンに画像を貼る方法 getImageメソッドで生成した画像は図形によって大きさが異なるので、一定の大きさに縮小してからボタンに貼り付ける

パネルへの配置例 private Drawable drawable; private JLabel l; private JButton b; : setLayout(new GridLayout(1, 2)); drawable = new Tree(); l = new JLabel(drawable.toString(), SwingConstants.CENTER); add(l); img = drawable.getImage(); newimg = img.getScaledInstance(imagesize, imagesize, java.awt.Image.SCALE_SMOOTH); b = new JButton(new ImageIcon(newimg)); b.addActionListener(this); add(b); 縦1,横2で配置 レイアウトマネージャーを無効にして絶対座標で指定する方法もあります http://www.javadrive.jp/tutorial/nulllayout/index1.html

描画に必要なメソッド 塗りつぶさずに描画 -> draw(int x, int y, Graphics g) 塗りつぶして描画 -> drawfill(int x, int y, Graphics g) 色の設定と取得 -> setColor(Color c), getColor() 塗りつぶすか選択 -> setFilled(Boolean b), getFilled() ボタンに画像を貼る -> getImage() : draw(…), drawfill(…) を場合分け 画像サイズを決定する -> getWidth(), getHeight() ChoosePanel( ) { drawable[0] = new Tree(); drawable[1] = new Tree(); drawable[2] = new BigCircle(); drawable[3] = new BigCircle(); drawable[1].setColor(Color.PINK); drawable[1].setFilled(true); drawable[3].setColor(Color.BLUE); drawable[3].setFilled(true); ・・・

Graphicsクラスによる描画 描画はpaintComponentメソッドで行う 描画には以下のようなメソッドが用意されている 文字列の描画 :drawstring(表示する文字列,x座標,y座標) 線の描画 :drawLine(始点のx座標,y座標,終点のx座標,y座標) 四角形の描画 :drawRect(x座標,y座標,横幅,高さ) 丸の描画 :drawOval(x座標,y座標,横幅,高さ) 多角形の描画 :drawPolygon(x座標の配列,y座標の配列,頂点数) 塗りつぶす場合はdraw~をfill~に変える

クリックしたところに描画する mouseClickメソッド内でクリックした座標を取得し、描画を行う ←2回めのHomeworkの解答例

図形とクリックした場所の保持 private ArrayList<ShapeObject> shapes=new ArrayList<ShapeObject>(); @Override public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < shapes.size(); i++) shapes.get(i).pd.draw(shapes.get(i).p.x,shapes.get(i).p.y, g); } public void mouseClicked(MouseEvent e) { Point p = e.getPoint(); shapes.add(new ShapeObject(currentDrawable, p)); repaint(); : private class ShapeObject { Drawable d; Point p; public ShapeObject(Drawable d, Point p){ this.pd = pd; this.p = p; repaintメソッドで再描画すると、これまでに描画していたものは消えてしまうので、LinkedHashMapやAllayListを使ってこれまでに描画した図形と描画した座標を保持する ←実装例 追加された形状を全て描画 クリックされたら形状と座標を追加 描画する形状と座標を保つクラス

継承を生かした描画 SmallCircleもBigCircleも大きさが異なるだけで描画する方法は同じなのでCircleクラスに処理をまとめることができる Circleクラス SmallCircleクラスとBigCircleクラスにはdrawメソッドが書かれていないので継承元のCircleクラスのdrawメソッドが呼ばれる SmallCircleクラス BigCircleクラス

メニューの作り方 メニューを作るにはJMenuBar,Jmenu,JMenuItemを用いる JMenuBar L JMenu L JMenuItem の構造になっていて、JMenuItemをクリックした時にイベントを発生させたい場合はJButtonと同様にActionListenerに登録し、actionPerformedメソッド内に処理を書く 表示する文字列やショートカットキーの設定 終了を押した時の処理

描画クラスの定義 基本的(primitive)な図形と複合的(compound)な図形を分けて考える 描画に必要なメソッドを考え、インターフェースにまとめる 基本的 複合的 必要なこと (メソッド) 実現したいこと (機能)

基本的な図形クラスの設計 Interface Drawable 全ての基本図形がDrawable のメソッドを使える BigSquare BigRectangle SmallRectangle BigIsoscelesTriangle SmallIsoscelesTriangle BigCircle SmallCircle ? IsoscelesTriangle Circle Rectangle Shape Polygon SmallSquare Square Interface Drawable void draw(int x, int y, Graphics g) void setColor(Color c) ・・・ 全ての基本図形がDrawable のメソッドを使える

複合的な図形クラスの設計 draw( int x, int y, Graphics g) の宣言はどこ? Tree の中で宣言? CompoundDrawable の中で宣言? Drawable から継承? getParts()の返り値は何? あらゆる図形を複数入れれる箱は..? Interface Drawable draw(int x, int y, Graphics g)? ・・・ Interface CompoundDrawable getParts() draw( int x, int y, Graphics g)? Tree draw( int x, int y, Graphics g)? SmallSquare BigIsoscelesTriangle SmallIsoscelesTriangle

描画に必要なメソッド 塗りつぶさずに描画 -> draw(int x, int y, Graphics g) 塗りつぶして描画 -> drawfill(int x, int y, Graphics g) 色の設定と取得 -> setColor(Color c), getColor() 塗りつぶすか選択 -> setFilled(Boolean b), getFilled() ボタンに画像を貼る -> getImage() : draw(…), drawfill(…) を場合分け 画像サイズを決定する -> getWidth(), getHeight() ChoosePanel( ) { drawable[0] = new Tree(); drawable[1] = new Tree(); drawable[2] = new BigCircle(); drawable[3] = new BigCircle(); drawable[1].setColor(Color.PINK); drawable[1].setFilled(true); drawable[3].setColor(Color.BLUE); drawable[3].setFilled(true); ・・・

BigCircle クラスの実装例 (Shape クラス) protected 修飾子はサブクラスのみがアクセス範囲

BigCircle クラスの実装例 (Circle クラス)

BigCircle クラスの実装例 (/3)

Tree クラスの実装例 (1/2)

Tree クラスの実装例 (2/2)

Treeクラスをもっと簡潔に 複合的な図形では、使用するパーツの定義と描画する座標の設定以外の処理はほとんど共通の処理を抽象クラスにまとめて書くと便利 継承 継承 他の複合的な形状のクラス

実装の過程 Circleクラスを参考にして四角形や三角形などの基本図形を作る Step1 Circleクラスを参考にして四角形や三角形などの基本図形を作る Step2 図形選択パネルにStep1で作成した図形の画像を貼り付けたボタンを表示する Step3 図形選択パネルのボタンを選んで、描画パネル上でクリックすると、クリックした場所に図形が描画される Step4 複合的な図形を実装する上で共通のメソッドをまとめたCompoundFigureクラスを定義し、Treeクラスなどの複合的な図形を表すクラスに継承させる Step5 おえかきツールでStep4で作成した図形を描画できるようにする Step6 TreeクラスのようなCompoundDrawbleを継承するクラスをメンバーに持つCompoundDrawbleを継承したクラスを5個以上作る Step7 メニューにヘルプの項目を作り、クリックすると作成者の名前が書かれたダイアログを表示させる Step8 おえかきツールにオリジナルの機能を追加する(Undoとかキャプチャとか)