web-dev-qa-db-ja.com

JTextFieldにフォーカスを設定する方法は?

マウスなしでゲームを実行するため、ポインターを使用することは選択できません。プレイヤーが負けるとハイスコアメニューが表示されます。

これは私のコードです

    highScore=new MyTextField("Your Name");
    highScore.addKeyListener(this);
    highScore.setFont(font);
    highScore.requestFocusInWindow();

私が試してみました

highScore.setFocusable(true);
highScore.requestFocusInWindow();
highScore.requestFocus(true);
highScore.requestFocus();

しかし、まだJTextFieldに焦点を合わせていません。

どのように焦点を合わせますか?

29
Kenjiro

GUIが表示されたときにJTextFieldに焦点を合わせたい場合、これを使用できます:

in = new JTextField(40);
f.addWindowListener( new WindowAdapter() {
    public void windowOpened( WindowEvent e ){
        in.requestFocus();
    }
}); 

fJFrameであり、inJTextFieldです。

50
Lukas Knuth

トップレベルコンテナ が1つしかない場合、GUIコンストラクタの最後の行はたとえば

.
.
.
myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {

   @Override
     public void run() {
         myComponent.grabFocus();
         myComponent.requestFocus();//or inWindow
     }
});
7
mKorbel
public void actionPerformed(ActionEvent arg0)
{
    if (arg0.getSource()==clearButton)
    {
        enterText.setText(null);
        enterText.grabFocus();  //Places flashing cursor on text box        
    }       
}
5
kprice789

私の場合、requestFocus()[〜#〜] after [〜#〜]が呼び出されるまで、上記のいずれも機能しませんでした。

MyPanel panel = new MyPanel(...);
frame.add(panel);
panel.initFocus();

MyPanel.initFocus()には次のものがあります。

myTextField.requestFocus();

そしてそれは動作します。

0
Peter Quiring

これを試して、

myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {

   @Override
     public void run() {
         myComponent.grabFocus();
         myComponent.requestFocus();//or inWindow
     }
});
0

このコードマウスカーソル「jtextfield」「Jcombobox」の場所にフォーカス

 try {
     Robot  robot = new Robot();
        int x = Jtextfield.getLocationOnScreen().x;
        int y=  Jtextfield.getLocationOnScreen().y;
       JOptionPane.showMessageDialog(null, x+"x< - y>"+y);// for I location see
        robot.mouseMove(x, y);
    } catch (AWTException ex) { 
        ex.printStackTrace();
    } 
0
Habib Göker

ページに複数のアイテムが含まれていて、タブシーケンスとフォーカスを設定したい場合は、FocusTraversalPolicyを使用することをお勧めします。

focusTraversalPolicyを使用している場合、grabFocus()は機能しません。

サンプルコード

int focusNumber = 0;
Component[] focusList;
focusList = new Component[] { game, move, amount, saveButton,
            printButton, editButton, deleteButton, newButton,
            settingsButton };

frame.setFocusTraversalPolicy(new FocusTraversalPolicy() {

        @Override
        public Component getLastComponent(Container aContainer) {
            return focusList[focusList.length - 1];
        }

        @Override
        public Component getFirstComponent(Container aContainer) {
            return focusList[0];
        }

        @Override
        public Component getDefaultComponent(Container aContainer) {
            return focusList[1];
        }

        @Override
        public Component getComponentAfter(Container focusCycleRoot,
                Component aComponent) {
            focusNumber = (focusNumber + 1) % focusList.length;
            if (focusList[focusNumber].isEnabled() == false) {
                getComponentAfter(focusCycleRoot, focusList[focusNumber]);
            }
            return focusList[focusNumber];
        }

        @Override
        public Component getComponentBefore(Container focusCycleRoot,
                Component aComponent) {
            focusNumber = (focusList.length + focusNumber - 1)
                    % focusList.length;
            if (focusList[focusNumber].isEnabled() == false) {
                getComponentBefore(focusCycleRoot, focusList[focusNumber]);
            }
            return focusList[focusNumber];
        }
    });
0
MukeshKoshyM

使用しようとしたとき、それは私のために働いていませんでした:

JOptionPane.showConfirmDialog(...)

しかし、-解決策を見つけました!非常に原始的ですが、動作します。

Java.awtでフィールドにジャンプするだけです。Robotキー「Tab」を使用します。例えば:

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_TAB);

コンポーネントを取得するために「Tab」を複数回押す必要がある場合は、以下の方法を使用できます。

GUIUtils.pressTab(3);

定義:

public static void pressTab(int amountOfClickes)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            try
            {
                Robot robot = new Robot();
                int i = amountOfClickes;
                while (i-- > 0)
                {
                    robot.keyPress(KeyEvent.VK_TAB);
                    robot.delay(100);
                    robot.keyRelease(KeyEvent.VK_TAB);
                }
            }
            catch (AWTException e)
            {
                System.out.println("Failed to use Robot, got exception: " + e.getMessage());
            }
        }
    });
}

コンポーネントの場所が動的である場合、whileループを無制限に実行できますが、コンポーネントにフォーカスリスナーを追加して、ループが到着したら停止します。

0
Adir

yourTextField.requestFocus()は解決策ですが、公式のJavaのドキュメントではrequestFocus()メソッドはプラットフォームに依存しているため、推奨されません。

ドキュメントには次のように書かれています:

このメソッドの動作はプラットフォームに依存するため、このメソッドの使用は推奨されません。代わりに、requestFocusInWindow()の使用をお勧めします。

代わりにyourJTextField.requestFocusInWindow()を使用してください。

0