[解決済み] SwingのrequestFocusInWindow()とgrabFocus()の違いについて
質問
との違いを教えてほしい。
requestFocusInWindow()
と
grabFocus()
メソッドを使用します。このプログラムでは、どちらのメソッドもフォーカスを取得するのに問題なく動作します。したがって、私はその違いがわかりませんでした。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Focus extends JFrame
{
JButton jb;
public Focus()
{
createAndShowGUI();
}
private void createAndShowGUI()
{
setTitle("grabFocus() vs requestFocusInWindow()");
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jb=new JButton("Open Dialog");
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae)
{
showDialog();
}
});
add(jb);
}
private void showDialog()
{
JDialog jd=new JDialog();
jd.setLayout(new GridLayout(2,2));
jd.setVisible(true);
JLabel l1=new JLabel("Label 1");
JLabel l2=new JLabel("Label 2");
JTextField jt1=new JTextField(20);
JTextField jt2=new JTextField(20);
jd.add(l1);
jd.add(jt1);
jd.add(l2);
jd.add(jt2);
// Both of them are doing the thing
//jt2.grabFocus();
jt2.requestFocus();
jd.pack();
}
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
new Focus();
}
});
}
}
解決方法は?
答えは簡単です。
grabFocus()
グラブ
は、最上位の祖先がフォーカスされているウィンドウであるかどうかに関係なく、フォーカスを取得します。ウィンドウがアクティブでない場合、コンポーネントにフォーカスが当たるようにアクティブにします。
ところ。
requestFocusInWindow()
は、呼び出されたコンポーネントのフォーカスを取得します。
のみ
その最上位の祖先がフォーカスされているウィンドウであるとき。
あなたの例では
JDialog
がトップレベルの祖先である場合、自動的にフォーカスを得ます。
JButton
がクリックされます。そのため
requestFocusInWindow()
と
grabFocus()
は違いがありません。
プラグマティックなアプローチで違いをよりよく理解するために、プログラムを書き直しました。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Focus extends JFrame
{
JButton jb;
JTextField jt;
public Focus()
{
createAndShowGUI();
}
private void createAndShowGUI()
{
setTitle("grabFocus() vs requestFocusInWindow()");
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jb=new JButton("Open Dialog");
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae)
{
showDialog();
}
});
add(jb);
jt=new JTextField(20);
add(jt);
}
private void showDialog()
{
JDialog jd=new JDialog();
jd.setLayout(new GridLayout(2,2));
jd.setVisible(true);
JLabel l1=new JLabel("Label 1");
JLabel l2=new JLabel("Label 2");
JTextField jt1=new JTextField(20);
JTextField jt2=new JTextField(20);
jd.add(l1);
jd.add(jt1);
jd.add(l2);
jd.add(jt2);
jt.requestFocusInWindow();
//jt.grabFocus();
jd.pack();
}
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
new Focus();
}
});
}
}
ここです。
requestFocusInWindow()
が呼び出されるのは
jt
となってうまくいかない(つまり
jt
がフォーカスを獲得しないためです。
JDialog
がアクティブになったときに
JButton
がクリックされ
JTextField
の中に
JDialog
がフォーカスを得る。
次に
grabFocus()
が動作します。このとき
JButton
がクリックされる。
JDialog
が表示されますが、アクティブにはなりません。なぜなら
grabFocus()
を実行すると、すぐに
JFrame
がアクティブなトップレベルの祖先となり
jt
は
強制
にフォーカスが当たるようにします。
関連
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】破損したjarファイル
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み】imageio.IIOException: 入力ファイルが読み込めない
-
[解決済み】Javaの".class期待値"
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み】Javaの".class expected "について
-
[解決済み】フォルダに書き込もうとすると「java.nio.file.AccessDeniedException」が発生する件
-
[解決済み】CreateProcess error=2, The system cannot find file specified.