JDK1.2のsetNextFocusableComponentって・・・

このQ&Aのポイント
  • JDK1.2では、setNextFocusableComponentでフォーカスを制御していましたが、JDK1.4以降では推奨されていません。
  • 代わりに、FocusTraversalPolicyを使用することが推奨されていますが、具体的な使用方法については詳細が不明です。
  • 移行の具体的な例や参考資料が必要です。
回答を見る
  • ベストアンサー

JDK1.2のsetNextFocusableComponentって・・・

こんにちは、tomokooです。 JDK1.2では、JFrameにJTextやJButtonを配置した場合、setNextFocusableComponentでフォーカスを制御してました。 SUNのJavadocによるとJDK1.4では、"推奨されていません。 JDK バージョン 1.4 以降は、FocusTraversalPolicy に置き換えられました。 " とあります。 FocusTraversalPolicyを見たりしたのですが、いまいちどう使っていいかよくわかりません。 移行の具体的な例を教えてほしいのですが。。。 例が載ってるURLや本でもかまいません。 よろしくお願いします。

noname#2102
noname#2102
  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • sasadora
  • ベストアンサー率68% (59/86)
回答No.4

4回目の書き込みです。(^^; ちょっと長いんですが、サンプル作成してみました。 従来のように、Nextを設定して使うようなFocusTraversalPolicyです。 Shift+TABによる逆順遷移については未対応で、デフォルトの動作をします。 ソースは見やすいように、半角スペース2個で全角スペースにしてあるので、 コピーしたあとに置換してください。 import java.awt.*; import java.awt.event.*; import java.util.Hashtable; public class FocusTest extends Frame{   public static void main(String args[]){     new FocusTest().show();   }   public FocusTest(){     Button btn1 = new Button("Button 1");     Button btn2 = new Button("Button 2");     Button btn3 = new Button("Button 3");     Button btn4 = new Button("Button 4");     Button btn5 = new Button("Button 5");     setSize(200, 200);     setLayout(new BorderLayout());     add(btn1, BorderLayout.NORTH);     add(btn2, BorderLayout.WEST);     add(btn3, BorderLayout.CENTER);     add(btn4, BorderLayout.EAST);     add(btn5, BorderLayout.SOUTH);     btn4.setEnabled(false);     addWindowListener(new WindowAdapter(){       public void windowClosing(WindowEvent e){         System.exit(0);       }     });     //フォーカス遷移ポリシーの作成     FocusTestTraversalPolisy tp = new FocusTestTraversalPolisy();     //遷移順の設定     tp.setNextFocusableComponent(btn1, btn5);  //Button1→Button5     tp.setNextFocusableComponent(btn5, btn2);  //Button5→Button2     tp.setNextFocusableComponent(btn2, btn4);  //Button2→Button4     tp.setNextFocusableComponent(btn4, btn3);  //Button4→Button3     tp.setNextFocusableComponent(btn3, btn1);  //Button3→Button1     //このFrameのフォーカス遷移ポリシーとして設定     setFocusTraversalPolicy(tp);   }   private class FocusTestTraversalPolisy extends ContainerOrderFocusTraversalPolicy   {     private Hashtable focusMap;     private FocusTestTraversalPolisy(){       focusMap = new Hashtable();     }     public void setNextFocusableComponent(Component src, Component dest){       focusMap.put(src, dest);     }     public Component getComponentAfter(Container focusCycleRoot, Component aComponent){       //Hashtableから次のコンポーネントを取得       Component next = (Component)focusMap.get(aComponent);       if(next == null){         //nullだったらデフォルトの動作         return super.getComponentAfter(focusCycleRoot, aComponent);       }       if(!accept(next)){         //遷移不可の場合は、さらにその次。(再帰)         return getComponentAfter(focusCycleRoot, next);       }       return next;     }   } }

noname#2102
質問者

お礼

sasadoraさん、大助かりです! ありがとうございますぅ(T_T) ちゃんと順番どおり動きました。 しかしここでまた問題が。。。 tabを2回押さないと動かない。 なんでだ!? JButtonやJComboBoxもカスタマイズしちゃってるからなんか影響出てるのかなー? ちょっと調べてみます。 ありがとうございました!!

noname#2102
質問者

補足

sasadoraさん、4回もお付き合いいただきありがとうございました。 また問題発生したらここで質問しますので、そのときはよろしくお願いします! まだtab1回で遷移してくれませんが、とりあえずここで締め切ります。 はー、sasadoraさんのメアドが知りたい・・・。 ありがとうございました♪

その他の回答 (3)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.3

JDK1.4.0入れました。(^^; ためし中です…。 >コンテナにaddした順にフォーカスを遷移させたいんです。でもaddした通りに動いてくれないんです(TT) addした順というのは不適切でした。 コンテナ内部におけるインデックスの順です。 インデックスを指定してaddすると、addするのが後でも指定した位置にaddできます。 FlowLayoutの場合、インデックス順序と配置順序が一致すると思うんですが、 BorderLayoutの場合、addした順に遷移すると思います。 Layoutは何を使用していますか? >そしてsasadoraさんが教えてくださった方法っていうのは、 >画面ごとにフォーカス遷移クラスを作るってことなのでしょうか? それは設計次第だと思います。40画面すべてで共通のFocusTraversalPolicyを作ることも可能です。 問題はどうやってAfter,BeforeのComponentを判断するかであって、それを40画面すべてで共通的な判断ロジックで作れば1つのFocusTraversalPolicyで十分かと思います。 FocusTraversalPolicyを使用するのも一案ですが、tomokooさんの場合は、 Layoutを別のものに変えれば十分な気もします。 とりあえず今、試してみているので、 あとでサンプルを書き込みにきますね。 (私にとっても非常に勉強になります。)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.2

ためしてもいないので恐縮なんですか…。 やりたいこととしては、デフォルトではなく独自のフォーカス遷移を定義したいんですよね? 方法としては、 1.FocusTraversalPolicyを継承したサブクラス作成する。  このサブクラスに独自のフォーカス遷移ロジックを定義すればいいんだと思います。 2.作成したクラスを、指定のコンテナにsetFocusTraversalPolicyで指定する  独自のフォーカス遷移ロジックがそのコンテナに対して適用されるんだと思います。 こう思ってます。 ただし、FocusTraversalPolicyを継承してゼロから作成するのは大変なので、標準のFocusTraversalPolicyサブクラスである、ContainerOrderFocusTraversalPolicyを継承して作ったほうがらくだと思います。 ContainerOrderFocusTraversalPolicyを継承して、getComponentAfterなどをオーバーライドしてやればいいんじゃないかと。(デフォルトの動作のままでよいときは、オーバーライドしないでおく。) 単純に、コンテナに追加した順序と異なる順序で遷移したい。などという簡単な場合は、コンテナに追加する順序をフォーカス遷移と同じ順序にしたほうが、いいような気もします。(addする順序を変える) #1.4は使ってないんで試せないんですが、いい機会なので暇があったら #私も試してみようかと思います。

noname#2102
質問者

お礼

sasadoraさん、二回もありがとうございます! コンテナにaddした順にフォーカスを遷移させたいんです。でもaddした通りに動いてくれないんです(TT) 画面を左から右へフォーカスが動いちゃうんです。 なにかを設定しないとだめなのでしょうか? そしてsasadoraさんが教えてくださった方法っていうのは、画面ごとにフォーカス遷移クラスを作るってことなのでしょうか? 画面は40ほどあるのでそれはとても大変な気が・・・。 もっともそれしかないならやるしかありませんが。 回答にあげてもらったクラスを覗きつつ、さらに色々試してみます。 ありがとうございました!

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.1

こんにちは、tomokooさん。 私も使ったことないので、よく分からないのですが…。 こんなページがありました。 参考になるんではないでしょうか?

参考URL:
http://www-6.ibm.com/jp/developerworks/java/020308/j_j-awtfocus.html
noname#2102
質問者

お礼

sasadoraさん、お早いお返事、ありがとうございます! 実はこれ、見たんです。 で、"リスト1. 理論的なフォーカス管理の例"のとおりやったのに動かない。。。 なんでだー? 設定が悪いのか、記述が抜けてるのか、私の頭が悪いのか(←これは否定できない・・・) 使ったことないのにお返事いただいて、ホントありがとうございました。 ちょっと感動しました(T_T)

関連するQ&A

  • JDK1.4でのフォーカス遷移

    こんにちは、tomokooです。 昨日から質問してばっかりですみません。。。 JFrame上にJComboboxやJTextFieldを配置した画面があります。 フォーカスを遷移させたいんですけれど、JComboboxでsetEditableがtureの部品だけ、tabを2回押さないとフォーカスが移ってくれません。 正確にはJComboboxにフォーカスは移ってるんですが、tabを2回押さないとカーソルが出てこない状態です。 setEditableがfalseの場合は一回tabを押せばカーソルも表示され、きちんと遷移します。 解決法ご存知の方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • JDKのインストールについて

    WindowsMeにJDK5.0以降のバージョンをインストールしようと試みたのですが、できませんでした。※1.4までのバージョンは正常にインストールできます。 (実際には、サン社からダウンロードしたJDK1.5.××のexeファイルを実行したところ抽出できない(実行できない)というダイアログが表示されてしまいインストールができませんでした。実行ファイルはWindows用のものでダウンロードしたファイルがまちがっているということはなさそうです。) 元々5.0以降のバージョンはWindowsMeにはインストールできないということでしょうか?? お詳しい方いらっしゃいましたら、どんな情報でも結構ですので、ぜひお教えください。よろしくお願いします。

    • ベストアンサー
    • Java
  • JDK?? SDK??

    今SDKの脆弱性について話題になっておりますが、 その点についてSolarisサーバで調べていたのですが、いまいちわからない点があります。 サーバにログインし、「java -version」と打つと、下記のように表示されるのですが、これはJDKなのかSDKなのかどちらなのでしょうか?? Solaris VM (build Solaris_JDK_1.2.2_07・・・・・ 一般的にはSDKとJDKの違いは、バージョン1.2以降がSDKと呼ばれるものと言われていますが、上記の表示結果だと、バージョンが「1.2.2_07」なのに、「JDK」と明記されています・・・。どなたか、この点についてJDKなのかSDKなのか解る方いらっしゃいますでしょうか? 例の脆弱性問題、JDKだと大丈夫(?)のようなので、真相を知りたいです。

  • JAVAのバージョンについて教えてください

    SUNのJDKのバージョン表記について教えて欲しいのですが、 JDK1.2.2というような表記と、Java2という表記があります。 どちらが新しいバージョンと判断すれば良いのでしょうか。 或いは、JDK1.2.2はJava2以前のものなのでしょうか。教えてください。 また、SDKというような表現もあって、JDKという表記とこんがらがってます。この違いも教えてください。 これらについて書いてあるURLがあったら教えてください。 よろしくお願いします。

  • Fedora8のjavaパッケージについて

    いつも参考にさせて頂いています。 Fedora8をインストールし、jdk1.5.0_15をインストールしたのですが、# rpm -aq | grep java でパッケージを確認したところ、下記のように表示されました。 sun-javadb-client-10.3.1-4.1 tzdata-java-2007h-1.fc8 java_cup-0.10-0.k.6jpp.1 java-1.7.0-icedtea-plugin-1.7.0.0-0.19.b21.snapshot.fc8 sun-javadb-common-10.3.1-4.1 sun-javadb-docs-10.3.1-4.1 java-1.5.0-gcj-1.5.0.0-17.fc8 sun-javadb-core-10.3.1-4.1 sun-javadb-javadoc-10.3.1-4.1 java-1.7.0-icedtea-1.7.0.0-0.19.b21.snapshot.fc8 sun-javadb-demo-10.3.1-4.1 # java -version とコマンドすると、 java version "1.7.0" IcedTea Runtime Environment (build 1.7.0-b21) IcedTea Client VM (build 1.7.0-b21, mixed mode) と表示されます。 私はJDK1.5.0_15を使いたいのですが、何かに上書きされている? しかも一体どれが必要で何のためのパッケージなのかよくわからず困っています。 必要のないものはアンインストールしたいのですが… JDK1.5を使用する場合、 「java-1.5.0-gcj-1.5.0.0-17.fc8」 以外は必要ないのでしょうか? どうか宜しくお願いいたします。

  • javadoc定数フィールド値の文字化けについて

    定数フィールド値にマルチバイト文字を記述すると、javadoc出力で該当の箇所が文字化けしてしまいます。 「そもそもWindowsだとUTF-8のファイルはダメ(LinuxならOK)」、「JDKのバグ(このバージョンだと大丈夫)」など、何かお気づきの点があればご教示ください。 [環境] ・OS:WindowsXP SP3 ・JDK:1.5.0_17 [実行したコマンド] javadoc -private -charset Windows-31J -encoding UTF-8 -docencoding Windows-31J -sourcepath [パス] [パッケージ] ※ やりたいことは、「UTF-8」のソースファイルから「Shift_JIS」のjavadocを作成することです。 [Javaソース] ・文字コード:UTF-8 ・改行コード:LF(CRLFでも同じ) ・記述内容  javadocコメントはマルチバイト文字で記述 -> 文字化けしない  定数フィールド値もマルチバイト文字で記述 -> 文字化けする   例)   /** ほげ */   private static final String hoge = "あいうえお";    -> フィールドの概要は文字化けせずに「ほげ」が出力される    -> 定数フィールド値は"\u3042\u3044\u3046\u3048\u304a"が出力される

    • ベストアンサー
    • Java
  • Java2とは何ですか?

    Java2とは何ですか? 下記HPによると http://e-words.jp/a/Java2.html 『Sun Microsystems社のプログラミング言語「Java」の第2版。Java 2はJDK 1.2と呼ばれていたものの正式名称で、SunによるJava 2プラットフォーム対応のプログラミング環境や実行環境も含む。』 とあります。1.2以前が第1版ということなんでしょうか? なんか2の意味がよくわからんなーと思っています。 1.2の2の部分の2ではなくそれ以外にバージョンがあって2ということなんですよね?タブン。 Sunの資料を見たところ、1.5系ではまだ、J2SE 5.0と表記されたりしているようですが、1.6と1.7に関する記述では、Java SE6、Java SE7と「2」が完全に消えていました。 今後は「2」はきえるのかなーなどと思っています。 この辺のことについてお詳しい方よろしくお願いします。 質問 (1)Java2の2はどこから来ているのか。どういう意味合いでつけたのか。 (2)いつまでが1だったのか。(時期やバージョンなど) (3)1.6以降は2は使われなくなるのか

    • ベストアンサー
    • Java
  • 携帯javaアプリ(MIDP)の開発環境について

    当方プログラミング初心者です。 willcomの端末上で起動させたいアプリを作りたいのですが、 開発環境が整いません。 http://www.atmarkit.co.jp/fjava/rensai4/keitaijgram02/keitaijgram02_3.html 上記ページに従いjavaをインストールをし、 プロジェクトの読み込みまではうまくいくのですが、 ビルトを行うと、 「JDKが見つかりませんでした」 コンパイルを行うにはフル構成のJava SE SDKを使用する必要があります。この機能を使用するため、Java SE SDK version 1.5以降をインストールし、Sun Java(TM) Wireless Toolkitを再インストールしてください。 と出てコンパイルできません。 色々試してみましたが(Application Platform + JDKのインストール )、 解決できないので困っています。 何かわかるかたいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • tomcatのwebapps配下のディレクトリの閲覧について

    初めまして、Sabaponです。 当方、現在tomcatを勉強を始めたばかりなのですが、 webapps配下に置くディレクトリの参照のことで困っております。 仮にルートディレクトリ名を「test」として、 webapps→test→WEB-INF という配置までは行ったのですが、ここで http://localhost:8080/test/ として参照しようとしたところ、tomcatのバージョンに よってディレクトリが閲覧できたりできなかったり しました。 いろいろバージョンを変えて試したところ バージョン4から5.5の前半ぐらいまでは空のディレクトリでも閲覧できたのですが、それ以降のバージョンでは 閲覧できませんでした。 自分なりにconfフォルダ内のxmlを書き換えたりしてみたのですが、うまくつながりません。 ちなみに現在インストールしているバージョンは tomcat:6.0.13、jdk:1.6.0_02 です。 もし、仕様であれば、バージョンを落とすしかないのかとも思ったのですが、ネットや書籍の情報でもできるだけ新しいバージョンを使用した方が良いと多くの方が 書かれているようなので、できれば、最新バージョンで 勉強したいと思っております。 全く、初歩的な質問で申し訳ございません。 なにとぞよろしくお願い申し上げます。

    • ベストアンサー
    • Java
  • photoshopでパスを使って画像を変形

    photoshopのCS以降のバージョンで、このような機能があるのを見たのですが、どのようにやるのか具体的な方法を忘れてしまいました。 どなたかご存知の方、教えてください。 photoshopに配置した画像をパスを使って自由に変形する方法です。 たとえば四角い画像を、パスを使って波打ったような形に変形させ、旗の画像を作ると言うような方法です。 他のフィルタを駆使してそのような形にする方法は知っていますが、あえて、photoshopのパスでの変形の方法を知りたいです。 photoshopのバージョンはCS以降、CS3までを所有しています。 よろしくお願い致します。

専門家に質問してみよう