マウスなしでゲームを実行するため、ポインターを使用することは選択できません。プレイヤーが負けるとハイスコアメニューが表示されます。
これは私のコードです
highScore=new MyTextField("Your Name");
highScore.addKeyListener(this);
highScore.setFont(font);
highScore.requestFocusInWindow();
私が試してみました
highScore.setFocusable(true);
highScore.requestFocusInWindow();
highScore.requestFocus(true);
highScore.requestFocus();
しかし、まだJTextField
に焦点を合わせていません。
どのように焦点を合わせますか?
GUIが表示されたときにJTextField
に焦点を合わせたい場合、これを使用できます:
in = new JTextField(40);
f.addWindowListener( new WindowAdapter() {
public void windowOpened( WindowEvent e ){
in.requestFocus();
}
});
f
はJFrame
であり、in
はJTextField
です。
トップレベルコンテナ が1つしかない場合、GUIコンストラクタの最後の行はたとえば
.
.
.
myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myComponent.grabFocus();
myComponent.requestFocus();//or inWindow
}
});
public void actionPerformed(ActionEvent arg0)
{
if (arg0.getSource()==clearButton)
{
enterText.setText(null);
enterText.grabFocus(); //Places flashing cursor on text box
}
}
私の場合、requestFocus()[〜#〜] after [〜#〜]が呼び出されるまで、上記のいずれも機能しませんでした。
MyPanel panel = new MyPanel(...);
frame.add(panel);
panel.initFocus();
MyPanel.initFocus()には次のものがあります。
myTextField.requestFocus();
そしてそれは動作します。
これを試して、
myFrame.setVisible(true);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myComponent.grabFocus();
myComponent.requestFocus();//or inWindow
}
});
このコードマウスカーソル「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();
}
ページに複数のアイテムが含まれていて、タブシーケンスとフォーカスを設定したい場合は、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];
}
});
使用しようとしたとき、それは私のために働いていませんでした:
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ループを無制限に実行できますが、コンポーネントにフォーカスリスナーを追加して、ループが到着したら停止します。
yourTextField.requestFocus()
は解決策ですが、公式のJavaのドキュメントではrequestFocus()
メソッドはプラットフォームに依存しているため、推奨されません。
ドキュメントには次のように書かれています:
このメソッドの動作はプラットフォームに依存するため、このメソッドの使用は推奨されません。代わりに、requestFocusInWindow()の使用をお勧めします。
代わりにyourJTextField.requestFocusInWindow()
を使用してください。