0

パネルをロードするフレームがあります。正常に動作しますが、ロード時にフォーカスがありません。タブを押しても役に立ちません。テキストフィールドを押すには、マウスを使用する必要があります。私は試しました:jtextfield1.requestFocus();jtextfiel1.requestFocusInWindow();しかし、それは動作しません。

私は何を間違っていますか?

のコンストラクターJPanel:

public OpretOpdater(BrugerHandler brugerHandler, ReklamationHandler reklamationsHandler) {
    initComponents();
    jTextFieldOrdnr.requestFocusInWindow();
    this.brugerHandler = brugerHandler;
    this.rekH = reklamationsHandler;
    startUp();
}

GUI のフレームにパネルを配置する:

public static void opret(ReklamationHandler reklamationHandler) {
    rHandler = reklamationHandler;
    SwingUtilities.invokeLater(opret);
}

static Runnable opret = new Runnable() {
    @Override
    public void run() {
        JFrame f = jframe;
        f.getContentPane().removeAll();
        JPanel opret = new OpretOpdater(bHandler, rHandler);
        f.getContentPane().add(opret);
        f.pack();
        f.setLocationRelativeTo(null);
    }
};
4

2 に答える 2

2

requestFocusInWindow()コンポーネントがコンテナに表示/表示されている場合、またはpack()が呼び出されてすべてのコンポーネントがコンテナに追加された後にのみ呼び出す必要があります。そうしないと、機能しません。

また、必ずEvent Dispatch Threadに Swing コンポーネントを作成してください。Swing での同時実行をまだ読んでいない場合。

上記の理由は、EDT で Swing コンポーネントを作成および操作しないと、コードにランダムなアーティファクトが発生する可能性があるためです。つまり、フォーカスが与えられていないなどです。

requestFocusInWindow以下のコードは、コンポーネントが表示される前に呼び出すと機能せず、表示された後に呼び出すと期待どおりに機能することを示すために作成されました。

また、SwingUtilitiesブロックを削除すると、requestFocusInWindowが期待どおりに機能しないことに注意してください (つまり、運に応じてフォーカスが与えられるかどうかが決まります:P):

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JTextField f1 = new JTextField(10);

        JTextField f2 = new JTextField(10);

        //f2.requestFocusInWindow(); //wont work (if uncomment this remember to comment the one after setVisible or you wont see the reults)

        JButton b = new JButton("Button");

        JPanel p = new JPanel();

        p.add(f1);//by default first added component will have focus
        p.add(f2);
        p.add(b);

        frame.add(p);

        //f2.requestFocusInWindow();//wont work
        frame.pack();//Realize the components.
        //f2.requestFocusInWindow();//will work
        frame.setVisible(true);

        f2.requestFocusInWindow();//will work
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {//if we remove this block it wont work also (no matter when we call requestFocusInWindow)
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

How to Use the Focus Subsystem を読むことをお勧めします。

于 2013-03-05T12:32:35.623 に答える
1

多くの場合、フィールドを作成するときにどのフィールドにフォーカスを置きたいかを示し、フレームが表示されたときにリクエスト フォーカスを追加してコードを分離しないと便利です。

この場合にも適用できるソリューションがあるDialog Focusを見てください。このアプローチを使用すると、コードは次のようになります。

JTextField f2 = new JTextField(10);
f2.addAncestorListener( new RequestFocusListener() );
于 2013-03-05T16:39:58.393 に答える