it-swarm-id.com

Bagaimana KeyListener mendeteksi kombinasi kunci (mis., ALT + 1 + 1)

Bagaimana saya bisa membiarkan kebiasaan saya KeyListener mendengarkan kombinasi ALT (atau CTRL dalam hal ini) + lebih dari satu kunci lainnya?

Asumsikan saya memiliki 11 tindakan berbeda yang saya ingin aplikasi lakukan, tergantung pada kombinasi tombol yang ditekan. ALT + 0 - ALT + 9 jelas tidak menimbulkan masalah, sedangkan untuk ALT + 1 + 0 (atau "ALT + 10" karena dapat dijelaskan dalam file Bantuan atau serupa) Saya tidak dapat menemukan solusi yang baik di mana saja di web (atau di kepala saya). Saya tidak yakin bahwa solusi ini dengan timer adalah satu-satunya cara yang mungkin.

Terima kasih banyak sebelumnya untuk saran!

Edit: Tindakan 0-9 + tindakan 10 = 11 tindakan. Terima kasih @ X-Nol.

19
s.d

Anda tidak boleh menggunakan KeyListener untuk jenis interaksi ini. Alih-alih menggunakan binding kunci, yang dapat Anda baca di Tutorial Java . Kemudian Anda dapat menggunakan InputEvent mask untuk mewakili ketika berbagai kunci pengubah berkurang. Sebagai contoh:

// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                            Java.awt.event.InputEvent.CTRL_DOWN_MASK),
                    "actionMapKey");
component.getActionMap().put("actionMapKey",
                     someAction);

Lihat javadoc untuk KeyStroke untuk kode yang berbeda yang dapat Anda gunakan saat mendapatkan KeyStroke. Pengubah ini dapat OR'ed bersama untuk mewakili berbagai kombinasi tombol. Seperti

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                       Java.awt.event.InputEvent.CTRL_DOWN_MASK
                       | Java.awt.event.InputEvent.SHIFT_DOWN_MASK)

Untuk mewakili ketika kunci Ctrl + Shift ditekan.

Sunting: Seperti yang telah ditunjukkan, ini tidak menjawab pertanyaan Anda melainkan harus dianggap sebagai saran yang bagus.

26
Jonathan Spooner

Anda dapat menggunakan KeyListener untuk tujuan ini dengan menggabungkan beberapa hal. Lihatlah contoh berikut, yang harus ditempatkan dalam metode keyPressed(KeyEvent e) yang diganti.

if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
        System.out.println("Select All"); 
}

String Select All akan ditampilkan saat Ctrl + a ditekan. Metode e.isControlDown() memeriksa apakah Ctrl ditekan atau tidak. Demikian pula halnya dengan Alt kombinasi tombol dapat dilakukan dengan metode yang sama dengan menggunakan metode e.isAltDown().

Logika di balik ini adalah, e.getKeyChar() mengembalikan karakter dari penekanan tombol & e.getKeyCode() mengembalikan kode ASCII-nya. Kapan Ctrl ditekan dan tahan, e.getKeyChar() tidak akan mengembalikan a dan e.getKeyCode() akan menjadi 65 yang sama. Semoga Anda mengerti ini. Jangan ragu untuk bertanya lebih banyak.

19
Sasivarnan

ALT + 1 + 0 (atau "ALT + 10" karena dapat dijelaskan dalam file Bantuan atau yang serupa)

tampaknya berselisih dengan (dari salah satu komentar Anda):

Jadi misalnya jika pengguna ingin mengubah data di kolom 11 (yang akan disebut "10"), ia akan menekan ALT + 1 + [melepaskan ALT dan 1] 0.

Dengan asumsi bahwa ALT + 10 berarti 'Menekan ALT, menekan dan melepaskan 1, menekan dan melepaskan 0, melepaskan ALT' Saya mengusulkan mencoba ini:

Di keyPressed, mendengarkan kunci ALT, mengaktifkan flag boolean, isAltPressed, dan membuat buffer untuk menahan penekanan tombol yang terjadi (string, katakanlah). .__ Dalam keyTyped, jika isAltPressed aktif, tambahkan kode kunci ke buffer . Dalam keyReleased, dengarkan lagi ALT, buka permintaan bersyarat buffer dan jalankan tindakan.

    public void keyPressed (KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_ALT){
        buffer = ""; //declared globally
        isAltPressed = true; } //declared globally
    }

    public void keyTyped (KeyEvent e){
        if (isAltPressed)
            buffer.append (e.getKeyChar());
    }

    public void keyReleased (KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_ALT){
            isAltPressed = false;
            if (buffer.equals (4948)) //for pressing "1" and then "0"
                doAction();
            else if (buffer.equals(...))
                doOtherAction();
            ...
        }//if alt
    }
2
sideways8

Saya pikir ada cara sederhana yang saya gunakan. Jika KeyEvent adalah ev maka jika Anda menyelidiki:

(int)ev.getKeyChar()

kamu menemukan itu ctrl-a adalah 1, ctrl-b adalah 2 dan seterusnya. Saya ingin menggunakannya ctrl-s untuk menghemat. Jadi saya hanya menggunakan:

(((int)ev.getKeyChar())==19)

untuk mendeteksinya. Tidak tahu mengapa, tetapi berfungsi dengan baik sedangkan:

ev.isControlDown() && ev.getKeyChar()=='s'

tidak.

0
dave110022

Saya menyarankan agar alih-alih menggunakan kombinasi tombol, pertimbangkan beberapa bidang input ketika jendela isVisible() dan terfokus. Kolom ini dapat disembunyikan, seperti pencarian nama file tersembunyi Windows Explorer File (masukkan direktori, ketik nama file dan korespondensi difokuskan), atau terlihat, seperti di Ubuntu. 

Kombinasi tombol tidak dirancang untuk memasukkan lebih dari satu tombol selain dari pengubah, meskipun Anda mungkin dapat mencapai ini.

0
WesternGun
import Java.awt.*;
import Java.awt.event.*;
class KDemo
{
     public static void main(String args[])
     {
           Frame f = new Frame();
           f.setSize(500,500);
           f.setVisible(true);
           f.addKeyListener(new KeyAdapter()
           {
               public void keyPressed(KeyEvent e)
               {
                   AWTKeyStroke ak = AWTKeyStroke.getAWTKeyStrokeForEvent(e);
                   if(ak.equals(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK)))
                   {
                     System.exit(0);
                   }
               }
           });
        }
   }
0
Venkat Esan