- ベストアンサー
MIDP開発での文字列入力
文字列を入力するためのTextFieldメソッドを使いたいのですが、Formクラスを継承したクラスでないと使えないとのことです。 Canvasを継承したクラス内で定義したいのですが、 どのようにして定義すればよいのでしょうか。 とても困っていますので、どなたかご存知の方が いらっしゃったらご教授いただきたいと思います。 よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
どういう形で作ってあるのかわからないのでなんともいえないのですが・・・。 まず、TextFieldは、Formを使って組み込んでありますか? でないと、選択キーで操作をしたりするのが難しくなります。通常は、Formを用意してここにTextFieldを組み込み、FormをsetCurrentして表示します。 このFormには、Commandを作成して組み込んでおきます。このへん、言葉で説明するのが難しいんですが・・・。 class クラス extends MIDlet implements CommandListener { private Form f; private TextField tf; private Command ok; public コンストラクタ(){ f = new Form("MIDLET"); tf = new TextField(・・略・・); f.append(tf); ok = new Command("OK","CommandSCREEEN,1); f.addCommand(ok); f.setCommandListener(this) Display.getDisplay(this).setCurrent(f); } public void commandAction(Command c,Displayable d){ if (c == ok){ String s = tf.getString(); // TextFieldのテキスト取得 ・・・適当に処理・・・ } } } だいたいこんな感じになります。Commandを作成してFormに組み込み、CommandListenerを設定しておきます。すると、何かコマンドが発生するとcommandActionメソッドで処理が行えるようになります。ここで、発生したCommandがあらかじめ用意しておいたCommandインスタンスと同じであれば、指定の選択キーを押したと判断されるわけです。 以下のURLなどわかりやすいですよ。 http://appli-style.com/midp/index.html
その他の回答 (2)
MIDPは最近すっかりご無沙汰なんですが・・・。 まず、「CanvasにTextFieldを組み込む」ことは、不可能です。したがって、他の方法で解決するしかありません。方法としては2通り考えられます。 1.あらかじめ、CanvasによるクラスとFormによるクラス(ここにTextFieldを組み込んでおく)のそれぞれを用意しておき、必要に応じてDisplayの.setCurrentメソッドを呼び出して2つの表示パネルを切り替えながら処理する。つまり、通常はCanvas表示しておき、テキストを入力するときだけFormにsetCurrentし、入力終了時にまたCanvasに戻すというわけです。両者の間の橋渡しはMIDletで管理すればよいでしょう。 2.Canvasクラス内にkeyPressedメソッドを配置して、そこでキーが押されたときの値を直接読み取って処理させる。(つまりTextFieldを使わず、直接キーの入力情報を取り出して入力を管理する) 2番目は必要に応じてキー入力をきれいに制御していかないといけないので、個人的には1の方法がわかりやすいかと思います。 最近MIDPは触ってないので、もっとスマートな方法があるかも知れませんが、参考ということで・・・。
補足
とても丁寧な回答ありがとうございます。 しかし、非常に勉強不足で大変申し訳ないのですが、 1のやり方で行う場合、 CanvasクラスのKeyPressメソッド内にて Display.getDisplay(MIDlet継承クラス.midlet).setCurrent(new TextField定義クラス()); このように定義してあげることによって、画面が切り替わり、テキストフィールドが表示されます。しかし、再度Canvasに戻るときに真ん中の選択ボタンを押下することによって入力文字列を取得しつつCanvasに戻りたいのですが、どのようにTextField定義クラスにて定義すればよいのでしょうか。 何度も申し訳ありませんが、よろしくお願いします。
- freedom560
- ベストアンサー率46% (80/173)
正直MIDPを開発したことはないですが・・・ 質問を見た限り、要するにjavaで二重継承の問題を解決したいと言う質問に置き換えられるようなので、「委譲を使ったAdapterパターン」を使えば解決できるような気がします。 つまり、Canvasを継承したクラスの内部にprivateなTextFieldのオブジェクトを作っておいて、使いたいTextFieldのメソッドはそのサブクラスの内部で呼べばいいわけです。 イメージでは class TextFieldCanvas extends Canvas { private TextField tf; String getText() { return tf.getText(); } void setText(String string) { tf.setText(string); } } と言った感じです。getTextやsetTextでないメソッドを呼び出したいときも同じように、そのメソッドをサブクラスで定義して、そのメソッドの内部でTextFieldのインスタンスメソッドを呼び出すようにすればよいです。 MIDPは使ったことがないので具体例が挙げられませんが、swingでJFrameクラスのサブクラスでJTextFieldクラスのメソッドを使う例をどうぞ。 import java.awt.event.*; import javax.swing.*; public class TextFieldAdapter extends JFrame{ private JTextField jtf; //委譲のためのオブジェクト public static void main(String args[]) { final TextFieldAdapter tfa=new TextFieldAdapter(); tfa.setVisible(true); tfa.setBounds(300,300,300,300); tfa.addKeyListener(new KeyListener(){ public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER) { //enterが押されたときTextFieldの文字表示 System.out.println(tfa.getText()); } //↑か↓が押されたときTextFieldに文字をセット else if(e.getKeyCode()==KeyEvent.VK_UP) { tfa.setText("↑が押されました"); } else if(e.getKeyCode()==KeyEvent.VK_DOWN) { tfa.setText("↓が押されました"); } } public void keyReleased(KeyEvent e) { } }); } TextFieldAdapter() { jtf=new JTextField(); this.getContentPane().add(jtf); //オブジェクトをセット } public void setBounds(int x,int y,int width,int height) { super.setBounds(x,y,width,height); //これを入れないとsetVisibleをsetBoundsの前に呼ばないといけない setVisible(isVisible()); } public void addKeyListener(KeyListener kl) { //FrameではなくTextFieldにセットする jtf.addKeyListener(kl); } //JFrameのサブクラスでJTextFieldのメソッドを呼ぶ String getText() { return jtf.getText(); } void setText(String string) { jtf.setText(string); } }
お礼
お礼が遅くなってしまい、大変申し訳ありませんでした。「委譲を使ったAdapterパターン」・・・ 調べてみたのですが、とても難しいのですね。 本当にご丁寧に回答していただいて、ありがとう ございました!
お礼
出来ました! 本当にご丁寧にありがとうございます。 Canvasクラスに入力文字が表示されたときは ちょっと感無量!って感じでした・・・