3

を作成するときKeyListenerは、次のフィールドが必要です。

public void keyPressed(KeyEvent e) 
{

}
public void keyReleased(KeyEvent e) 
{

}
public void keyTyped(KeyEvent e) 
{

}

System.out.println(e)ただし、メソッドに入れるkeyPressedと、Enterキーを押すと次のように返されます。

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=10,keyText=?,keyChar=?,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on javax.swing.JButton[,1,1,100x100,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@13b33a0e,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=HI,defaultCapable=true]

これは明らかにKeyEventではないため、を呼び出すために使用することはできませんkeyPressed(KeyEvent e)。私ができるようにしたいのは、キー、特にエンターキーの押下をシミュレートして、をアクティブにし、keyListenerそのテキストをJTextAreaに出力することです。

注: KeyEventsを完全にシミュレートするにはどうすればよいですか?、そしてそれが実際にどのように機能するかについてはほとんど理解していませんでした、そして私は私が理解するコードが欲しいです。私もここを見ましたjavaでキーボードの押下をシミュレートする方法は?、しかし私はロボットを動かすことができませんでした。キーが押されたはずのときに何も起こりませんでした。

4

4 に答える 4

5

eはKeyEventです。

e値を確認したい場合は、これを試すことができます

System.out.println(e.getKeyChar());

KeyEventの作成:

KeyEvent e = new KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar, int keyLocation);

例(これが正しい方法である場合はdunnoですが、正しい出力が生成されます):

Button a = new Button("click");
    KeyEvent e;
    e = new KeyEvent(a, 1, 20, 1, 10, 'a');
    System.out.println(""+e.getKeyChar());
    System.out.println(""+e.getKeyCode());

これがすべてのタイプのKeyEventパラメーターです

java.​awt.​event.​KeyEvent
@Deprecated public KeyEvent(Component source, int id, long when, int modifiers, int keyCode)
Deprecated. as of JDK1.1

===

java.​awt.​event.​KeyEvent
public KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar)
Constructs a KeyEvent object.
Note that passing in an invalid id results in unspecified behavior. This method throws an IllegalArgumentException if source is null.
Parameters:
source - the Component that originated the event id - an integer identifying the type of event when - a long integer that specifies the time the event occurred modifiers - the modifier keys down during event (shift, ctrl, alt, meta) Either extended _DOWN_MASK or old _MASK modifiers should be used, but both models should not be mixed in one event. Use of the extended modifiers is preferred. keyCode - the integer code for an actual key, or VK_UNDEFINED (for a key-typed event) keyChar - the Unicode character generated by this event, or CHAR_UNDEFINED (for key-pressed and key-released events which do not map to a valid Unicode character) 
Throws:
IllegalArgumentException - if id is KEY_TYPED and keyChar is CHAR_UNDEFINED; or if id is KEY_TYPED and keyCode is not VK_UNDEFINED IllegalArgumentException - if source is null

===

java.​awt.​event.​KeyEvent
public KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar, int keyLocation)
于 2013-02-14T02:56:19.700 に答える
2

ロボットを使用する場合は、最初にKeyListenerを追加するコンポーネントのフォーカスを取得します。次に、ロボットを使用してキーの押下を同時に行うことができます。別の方法として、リスナーが追加されたコンポーネントでdispatchEventを使用することもできます。

KeyEvent key = new KeyEvent(inputField, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, KeyEvent.VK_UNDEFINED, 'Z');
inputField.dispatchEvent(key);

あなたが持っていることを提供する:

JInputField InputField = new JInputField();

上記のようにKeyEventを作成し、それをリスナーのkeyTypedメソッドに渡すこともできます。keyPrssedについても、同じことができます。

于 2013-02-14T03:23:14.197 に答える
1

あなたは次のように述べています。

それは私のコードの一部をより効率的にするだろうと私は信じています。特定の条件が満たされると(私はハングマンをやっていて、これは私の先生との冗談である「チート」です)、コンピューターは正しいキーを押して答えを「推測」します。そして、単純なものがあります、私は私ができるかどうか疑問に思いますか?その一部。それは私がJButton.doClick()を見て、JTextFields用のものがあるかどうか疑問に思ったときに始まりました

私が疑ったように、あなたはこれについてすべて間違っている。プログラムでキーを押したい場合は、KeyEventsを作成する必要はありません。「キー」がJButtonの場合はdoClick()、ボタンを呼び出すだけで十分です。JTextFieldにテキストを入力したい場合は、テキストを設定するだけで十分です。すなわち、

たとえば、Swing Timerで以下のテキストのビットを呼び出した場合(テキストが追加されていることを確認できるように速度を落とすには:

String myText = myTextField.getText();
myText += nextBitOfText;
myTextField.setText(myText);

あなたはおそらくあなたが望む効果を得るでしょう。

例えば:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

@SuppressWarnings("serial")
public class AddTextToTextField extends JPanel {
   public static final String[] POSSIBLE_TEXTS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
   public static final int TIMER_DELAY = 500;
   private JTextField myTextField = new JTextField(20);
   private JButton myButton = new JButton(new BtnAction("Press Me"));
   private Random random = new Random();

   public AddTextToTextField() {
      add(myTextField);
      add(myButton);
   }

   private class BtnAction extends AbstractAction {
      public BtnAction(String text) {
         super(text);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         setEnabled(false);
         myTextField.setText("");
         myTextField.setFocusable(false);
         String randomText = POSSIBLE_TEXTS[random.nextInt(POSSIBLE_TEXTS.length)];
         new Timer(TIMER_DELAY, new TimerAction(this, randomText)).start();
      }
   }

   private class TimerAction implements ActionListener {
      private AbstractAction btnAction;
      private String text;
      private int count = 0;

      public TimerAction(AbstractAction btnAction, String text) {
         this.btnAction = btnAction;
         this.text = text;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         if (count <= text.length()) {
            myTextField.setText(text.substring(0, count));
            count++;
         } else {
            ((Timer)e.getSource()).stop();
            btnAction.setEnabled(true);
            myTextField.setFocusable(true);
         }
      }
   }

   private static void createAndShowGui() {
      AddTextToTextField mainPanel = new AddTextToTextField();

      JFrame frame = new JFrame("AddTextToTextField");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2013-02-14T03:19:24.867 に答える
0

これを使用して、仮想イベントをディスパッチできます。

textArea.dispatchEvent(new KeyEvent(jFrame,
        KeyEvent.KEY_TYPED, System.currentTimeMillis(),
        0,
        KeyEvent.VK_ENTER));

それを試してみてください、それはうまくいくはずですが、それは記憶からでした

于 2013-02-14T02:58:23.270 に答える