سؤال

وكيف تحصل على رمز VK من شار وهذا هو الرسالة؟ يبدو أنك ينبغي أن تكون قادرة على فعل شيء مثل javax.swing.KeyStroke.getKeyStroke('c').getKeyCode()، ولكن هذا لا يعمل (والنتيجة هي صفر). الجميع يعرف كيفية الحصول على رمز المفتاح إذا كان لديك بالفعل KeyEvent، ولكن ماذا إذا كنت ترغب فقط لتحويل حرف إلى [إينتس] VK؟ أنا غير مهتم في الحصول على رمز FK لشخصيات غريبة، فقط [A-Z]، [أ-ي]، [0-9].

وسياق هذه المشكلة -------- كل من الدروس روبوت رأيت تحمل المبرمجين الحب لتوضيح الكلمات عن طريق إرسال الضغط على المفاتيح مع رموز VK:

<اقتباس فقرة>
int keyInput[] = {
      KeyEvent.VK_D,
      KeyEvent.VK_O,
      KeyEvent.VK_N,
      KeyEvent.VK_E
  };//end keyInput array

واتصل بي كسول، ولكن حتى مع كسوف هذا ليس وسيلة للذهاب حول استخدام TDD على واجهات. إذا حدث أي شخص أن يعرف من فئة تشبه الروبوت التي تأخذ سلاسل ثم يحاكي إدخال المستخدم لتلك السلاسل (أنا باستخدام <لأ href = "http://www.javaworld.com/javaworld/jw-07-2007/ JW-07-fest.html "يختلط =" نوفولو noreferrer "> FEST )، وأنا أحب أن أعرف.

هل كانت مفيدة؟

المحلول

وربما هذا الإختراق القبيح:

Map<String, Integer> keyTextToCode = new HashMap<String, Integer>(256);
Field[] fields = KeyEvent.class.getDeclaredFields();
for (Field field : fields) {
    String name = field.getName();
    if (name.startsWith("VK_")) {
        keyTextToCode.put(name.substring("VK_".length()).toUpperCase(),
                          field.getInt(null));
    }
}

وkeyTextToCode عندئذ تحتوي على رسم الخرائط من السلاسل (مثل "A" أو "PAGE_UP") لكيه الرموز.

نصائح أخرى

AWTKeyStroke.getAWTKeyStroke('c').getKeyCode();

وتوضيح طفيف من بيس الجواب . يجب أن تكون علامات الاقتباس المفردة (وهو ما يمثل حرف)، ونقلت يست مزدوجة (وهو ما يمثل سلسلة).

<ع> استخدام علامات الاقتباس المزدوجة سوف رمي java.lang.IllegalArgumentException (سلسلة تنسيقها بشكل غير صحيح).

AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();

وأنا باستخدام التعليمات البرمجية التالية للرسائل العليا القضية والأرقام في الصف الأول كتب تمديد الروبوت:


public void typeLetterOrNumber(char c) {
    if(Character.isLetter(c)) {
        keyPress((int)c);
        keyRelease((int)c);
    }
    else if(Character.isDigit(c)) {
        keyPress(48+(int)c);
        keyRelease(48+(int)c);
    }
}

والأساس، ونظرت فقط في <ط> KeyEvent.VK_whatever القيم وفعل الرياضيات المناسبة للتعويض في قانون بلدي.

وأنا لا أعتقد أن هناك إجابة سهلة لهذا الغرض.

وندرك أولا أن جافا اثنين من حرف بايت وليس ما يقرب من 2 ^ 16 في KeyEvent.VK_ محددة. لذلك هناك ستكون حرف التي لا KeyEvent يمكن أن تتولد للحصول على هذا الانتاج.

وأيضا، C و C و C و ç جميعا نفس KeyEvent.getKeyCode() == KeyEvent.VK_C.

والجواب آدم بينتر (أجاب على السؤال تحويل سلسلة إلى KeyEvents ) ينبغي أيضا يعمل هنا. فكرة بسيطة ولكن العمل هو أن يكون التحول الكبير كما يلي:

public void type(char character) {
    switch (character) {
    case 'a': doType(VK_A); break;
    case 'b': doType(VK_B); break;
    case 'c': doType(VK_C); break;
    case 'd': doType(VK_D); break;
    case 'e': doType(VK_E); break;
    // ...
    case 'A': doType(VK_SHIFT, VK_A); break;
    case 'B': doType(VK_SHIFT, VK_B); break;
    case 'C': doType(VK_SHIFT, VK_C); break;
    // ...
    }
}

وينظر جواب الأصلية لالقائمة بأكملها (بما في ذلك الطبقة المحيطة المنفعة).

إذا هدفك الأساسي هو لكتابة الرسائل في أسرع وقت ممكن، يمكنك أن تفعل ما فعلته التي كان لكتابة السلسلة إلى الحافظة، وبعد ذلك فقط استخدام فئة Robot لدخول السيطرة + V.

static void type(String s) {
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(s), null);
    robot.setAutoDelay(30);
    robot.keyPress(VK_CONTROL);
    robot.keyPress(VK_V);
    robot.keyRelease(VK_CONTROL);
    robot.keyRelease(VK_V);
}

وهناك بعض الميزات الأخرى في الحافظة النظام الذي يمكن أن تسمح لك لحفظ واستعادة أي بيانات في الحافظة، في حال كنت في حاجة إليها. كذلك، إذا كنت تريد التحكم في سرعة بين كل حرف، كنت قد وضعت كل حرف في الحافظة في وقت واحد، مع robot.delay(n); بينهما، وذلك باستخدام حلقة foreach.

وهناك 2 طرق وجدت:

وA. استخدام الحل من JButton.setMnemonic، getMnemonic:

javax.swing.JButton but = new javax.swing.JButton();
but.setMnemonic(charVkValue);
int intVkValue = but.getMnemonic());

B. تحميل مصدر جدك مفتوحة ونرى (شار) منهجه AbstractButton.setMnemonic. تم ترخيص هذا الرمز تحت GPL2، ولكن هذه خطوط 4 تفعل عادة نفس الجواب مع "بضغطة (48+ (الباحث) ج)".

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/swing/javax/swing/AbstractButton.java.htm

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top