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

解決済みの質問

描写した文字をドラッグしたい

テキストフィールドに文字をキーボードから一文字(最終的に文字列にするつもりです)入力し、クリックすると文字を描写するというプログラムをjavaで作成しました。

今度は描いた文字をドラッグして移動したいのです。ですが考えても方法が思いつきません。
移動だけでなく、描いてから文字の修正や文字をドラッグすることでドラッグされた文字を配列に入力できるようにするつもりです。

またウインドウサイズを変更すると消えてしまいます。これは調べたところ再描写されるからだとわかりました。ですが対処方法がいまいち理解できませんでした。書いたものを残しておくというのがよくわかりません。サイズ変更したらその都度描写を今までのもの全てし直すということですか?それは描写が増えれば処理が遅くなりそうな気がするのですが。

とりあえず簡単に作った文字入力のプログラムです。よろしくお願いします。

import java.awt.*;
import java.applet.*;
import java.awt.event.*;


public class DrawString extends Applet implements MouseListener,KeyListener{
int x1,x2,y1,y2;
TextField test1 = new TextField(30);
char str1;
String str="testda";
int n=0;

public DrawString(){
addMouseListener(this);
test1.addKeyListener(this);
add(test1);
setForeground(Color.black);
setBackground(Color.white);

}
public void mouseClicked(MouseEvent arg0) {}

public void mouseEntered(MouseEvent arg0) {}

public void mouseExited(MouseEvent arg0) {}

public void mousePressed(MouseEvent arg0) {
// TODO 自動生成されたメソッド・スタブ
arg0.consume();
x1 = arg0.getX();
y1 = arg0.getY();
repaint();
}

public void mouseReleased(MouseEvent arg0) {}

public void paint(Graphics g){
g.drawString(str1+"。",x1,y1);
}

public void keyPressed(KeyEvent arg0) {}
public void keyReleased(KeyEvent arg0) {}
public void keyTyped(KeyEvent arg0) {
n++;
str1 = arg0.getKeyChar();
}

public void update(Graphics g){
paint(g);
}
}

投稿日時 - 2009-01-09 14:57:38

QNo.4616401

すぐに回答ほしいです

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

毎回、自己流で回答して申し訳ないのです。
しかし、質問者様からアプリケーション設計のことについてまったく聞いていないので自己流で作るしかない状況です。
まずは、アプリケーションの設計から考えるべきではないでしょうか。
単に動けばいいではダメなのです。
アプリケーションなんてとくにそうですよね。
質問のプログラムがうまくいかないのはそもそもに正しい設計がなされてないからです。

1つでもコンポーネントを実装するならば、キャンバスを配置し、その中で描画をするべきです。
次に前の回答でも言ったようにコンポーネントの機能を正しく使いましょう。
そして、アプレットはブラウザで動かすためのものであり、コンポーネントを配置するのならパネルに配置しましょう。
そもそもAWT,swingとAppletは全くの別物です。
普通は、アプレットかフレームを継承したクラスをメインクラスにし、メインクラスは各パネルの親クラスであり、パネル遷移だけを行うよう設計します。

まず決めるべきはレイアウトです。
・既存のレイアウトで既存のコンポーネントを配置(大抵はグループレイアウトか外部ライブラリのレイアウトを使います)
この方法で作ったアプリケーションは信頼性が高い。
さまざまな機能が使えるのでつくるのが楽。

・既存のコンポーネントを使わず、イメージを描画する(イベント処理は座標を判定して区別します)
自由な配置ができ、自由に部品の形を決められる。
AWT,swingにはないような機能を持ったコンポーネントが作れる。

前者がアプリケーション向き、後者がゲーム向きのレイアウト設計ですが、結局どっちの方法をとるかは好みの問題です。

次に機能ごとにクラスで分けることです。
そもそもに単一クラスのアプリケーションなんてありえませんし、バグが出ることが明らかなので使いたくありません。
基本として、画面の表示と処理の部分は分けましょう。
これがごっちゃになっているとバグの原因になりますので。
こういった原因で起こったバグは設計を見直さなくては直りません。
(大半は作り直すことになる)

最後に処理の流れです。
仕様書と言われるものを書きましょう。クラス図や状態遷移図など正規表現で書くのが理想ですが、自分ひとりだけでつくるならメモ書き程度
でもよいでしょう。
これがなければ
・しばらく経ってからソースを見てもわけがわかならい
・バグが起きてもどこで起きてるか特定しづらい
・多人数で作業する際は作り方がバラバラになってしまう
・そもそもにどういったものを作るのかはっきりしない
などなど他にも様々な弊害があると思いますよ。

自分は学生なのでこの程度しかのアドバイスできません。。。
もっと正確なことを知りたいのならば、専門家の方からアドバイスをいただくのも手かもしれませんね。
まぁ、プランがしっかりしてないと相談にも乗ってくれないと思いますが。。。

投稿日時 - 2009-01-12 14:23:29

お礼

解答ありがとうございます。本当に毎回感謝しています。
説明が足りない等のことは重々承知していました。それに毎回答えていただいてありがとうございます。
何度も答えていただいたおかげでわからないことだらけですが少しずつ創り出すことが出来ています。始めはスタートすら出来ませんでした。

言われた通り丁度闇雲に作らず、しっかり仕様を考えてました。こうすると作りやすくなりそうですね。

投稿日時 - 2009-01-12 14:34:32

ANo.2

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

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

回答(2)

ANo.1

今回の場合はAWTではなくswingを使いましょう。
既存のコンポーネントを使っているのなら、わざわざコマンドライン引数をわたしたり、キーイベントで文字を入力する処理を書く必要はありません。
実行時にテキストフィールドをクリックすれば、そのまま文字を入力を入力できます。
そもそも、そのために用意されたコンポーネントです。
ちなみに
test1.setText("abc");
とすれば、test1の中の文字列を"abc"に変更でき、
test1.getText();
とすれば、test1の中の文字列"abc"を取り出せます。

前回の質問での最初の回答にswingで作った、テキストボックスに書いた文字列にドラッグで範囲を指定するとコンボボックスに格納するプログラムがあるはずなので、まずはそれを参考にしてください。

投稿日時 - 2009-01-09 16:22:09

お礼

解答ありがとうございます。
あれから色々試しテキストの表示はできるようになりました。
ただ以前の質問からの続きにもなりますがテキストのドラッグかつ直線の描写を同一画面でするのが目標です。
実際にあるペイントソフトのように文字も書くことが出来れば直線も描写できたりしますし、文字の再編集も出来たりできればと思っています。

基本的に文字列を入力してもらい表示します。表示したウインドウと別に編集ウインドウを作り、そこでの編集(編集とはドラッグした言葉に対する追加情報を入力し文字の上に表示するなど)を表示ウインドウに表示していけたらと思います。表示画面で出来ることは文字のドラッグです。移動はしません。

というのがしたいことの一部です。
とりあえず今困っていることはどうやって線の描写と文字の表示を同じ画面で行えるのかです。
お願いします。

投稿日時 - 2009-01-11 16:29:13

あなたにオススメの質問