こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

文字、矢印等自由に書けるjavaプログラムを作りたい

javaで以下のようなプログラムを作ろうと思っています。その際に必要な書籍、サイトがあれば教えていただけませんか?
卒論にあたるので1月中に作り終える予定です。指導教師に聞くのが最もですが、年末でということで連絡が付かず質問します。

イメージとしてはお絵描きソフトと思っていただけたら大丈夫です。ただフリーで書くのではなく、文字入力ボタンや矢印など基本的に与えられた方法での入力のみと考えています。ただ書いた文字等はドラッグで移動できるようにしたいです。さらに書いた文字、矢印一つ一つ意味を持たせるつもりです。この矢印は[1]もしくは[2]の意味など。

今の知識としたらC言語はできますが、JAVAでのみ使う知識(Cで使わない知識)は曖昧です。

基本知識に関することはどこの書店でもありますから問題ないのですが、実際にどのように創り出せばよいかわからず困っています。サンプルプログラムがあれば参考にしていきたいと思っています。ですが見つからず困っています。

質問としては、簡単なお絵描きソフトを作りたいのですが参考になる書籍、サンプルプログラムがある書籍やサイト等なんでも構いませんので教えていただけたらと思います。

よろしくおねがいします。

投稿日時 - 2008-12-26 13:04:40

QNo.4584333

すぐに回答ほしいです

質問者が選んだベストアンサー

まず、AWTとSwingの長所をあげていきます

Swing
・コンポーネント(ボタンやラベルなどの部品)関係がよくサポートされており、なおかつAWTに比べてコンポーネントの処理が軽いです
・コンポーネントへの描画処理が優れている

故に、コンポーネントを多く利用する場合こっちがオススメです

AWT
・画面への描画処理が優れている
・イベント処理(キーを押した、マウスをドラッグしたなど)に対する、再描画が高速(これが今回の決め手)
・システム側、アプリケーション側の両方が描画処理を行うので柔軟な描画処理が行われる

描画処理を主とするのなら断然こっち

以上のことをふまえた上で考えると、今回のアプリケーションはコンポーネントのサポートより、描画処理を重視すべきと考えたのでAWTにしました。


そもそもJavaにはオブジェクト指向というものがあり以下のような利点があります。
・クラス間のセキュリティが強力(カプセル化といい、別のクラスからデータを勝手にアクセスできないようにできます)なため独立性がある

つまり、機能や処理でプログラムをわける設計構造になります

機能ごとにわけるので機能の変更や追加にも強い

・ソースの再利用性が高い(別のクラスの機能も必要に応じて呼び出せます)
つまり、同じ処理を書く必要は一切なくなります

ということですので、Javaをやる際はオブジェクト指向の理解を深めることをオススメします

投稿日時 - 2008-12-30 23:30:37

お礼

返事が遅れて済みません。
違いがなんとかわかりました。オブジェクト指向というのはよく聞き、利点もわかります。ですがまだ理解にはほど遠いような気がします。
また質問することがあると思います。
ありがとうございました。

投稿日時 - 2009-01-05 11:45:29

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

AppletやAWT(Swingというものもあるが、今回は向かないので却下)といったものを使えばできると思われます。

Javaをやる際にはまず↓をブックマークするとよいでしょう
http://java.sun.com/javase/ja/6/docs/ja/api/index.html
Javaにはライブラリで様々な機能が元から備わっています。(AppletやAWTもその一部です)上記のページにはその一覧が載っています。

下記に自分が書いたサンプル(ひらがな50音を描画するプログラム)がありますので、それをまじえてキーをタイプすると文字を入力するプログラムの説明をしたいと思います。

(本当は機能ごとにクラスで分けたほうがよいのですが、C使いの方には慣れないことなので単一クラスで書いてあります)
Javaの文法、構造などには疑問を持つと思われますが、回答の文字数に限りがあるので質問は別途受け付けます。

import java.applet.Applet;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Oekaki extends Applet implements KeyListener{
//ひらがなが格納された文字型の配列
String[][] str={{"あ","い","う","え","お"},
{"か","き","く","け","こ"},
{"さ","し","す","せ","そ"},
{"た","ち","つ","て","と"},
{"な","に","ぬ","ね","の"},
{"は","ひ","ふ","へ","ほ"},
{"ま","み","む","め","も"},
{"や","い","ゆ","え","よ"},
{"ら","り","る","れ","ろ"},
{"わ","うぃ","う","うぇ","を"}};
//実際に描画する文字列(配列なのは改行を実装するため)
String[] paintStr=new String[10];
//xとyはカーソルの位置.boin,siinはstrの要素
int x=0,y=0,boin=0,siin=0;
//書き込んでいいか悪いかのフラグ
boolean write=false;
//アプレットの初期化をするメソッド
public void init(){
//アプレットの画面サイズの設定
setSize(200,200);
//キーリスナを登録
addKeyListener(this);
//文字フォントの指定
setFont(new Font("MS UI Gothic",Font.PLAIN,20));
//描画する文字の初期化(初期化しないと描画でエラーになる)
for(int i=0;i<10;i++){
paintStr[i]="";
}
}
//描画をするメソッド
public void paint(Graphics g){
//ここでのiは行数
for(int i=0;i<10;i++){
g.drawString(paintStr[i],0,i*20+15);
}
g.drawLine(x*15,y*20,x*15,y*20+20);
//フォーカスを設定
requestFocusInWindow();
}
//キーをタイプした時の処理
public void keyTyped(KeyEvent e){
//StringBufferは文字列を操作するAPI
StringBuffer sb=new StringBuffer(paintStr[y]);
switch(e.getKeyChar()){
//2468は矢印キーの代わり,ifの条件は配列のオーバーを防ぐため
case '8':if(y>0){y--;x=0;}break;
case '6':if(x<20){x++;}break;
case '4':if(x>0){x--;}break;
case '2':if(y<10){y++;x=0;}break;
//.は文字の消去
case '.':
if(paintStr[y].length()>0){
sb.delete(paintStr[y].length()-1,paintStr[y].length());
paintStr[y]=sb.toString();
x--;
}
break;
//配列strのsiinの参照位置を設定
case 'k':siin=1;break;
case 's':siin=2;break;
case 't':siin=3;break;
case 'n':siin=4;break;
case 'h':siin=5;break;
case 'm':siin=6;break;
case 'y':siin=7;break;
case 'r':siin=8;break;
case 'w':siin=9;break;
//配列strのboinの参照位置を設定
//母音なので書き込みフラグをtrueにする
case 'a':boin=0;write=true;break;
case 'i':boin=1;write=true;break;
case 'u':boin=2;write=true;break;
case 'e':boin=3;write=true;break;
case 'o':boin=4;write=true;break;
}
if(write==true){
//insertは文字列を挿入する
sb.insert(x,str[siin][boin]);
paintStr[y]=sb.toString();
x=paintStr[y].length();
//strの参照位置の初期化
siin=0;
boin=0;
//falseにしないと無限ループ
write=false;
}
//再描画処理
repaint();
}
//使わないメソッドですが、これがないとエラーになる
//(Javaのインターフェースのめんどくさいところ)
public void keyPressed(KeyEvent e){}
public void keyReleased(KeyEvent e){}
}

投稿日時 - 2008-12-27 17:24:08

お礼

解答ありがとうございます。
あれから色々考えているのですが、とりあえず作りながら考えて行こうかなと思っています。でもあとから作った機能を変更できるのは容易なのかなど、経験不足の自分にはわからないところもあり悩んでいます。
swingは不向きというのはどういうことなのでしょうか?
applet,awt,swingの何が違うのか調べたところ曖昧にしかわからない状況です。特にawtとswingの違いが微妙です。

投稿日時 - 2008-12-30 19:02:13

あなたにオススメの質問