2012-08-14 95 views
-2

我需要對我的Java代碼一些幫助我在Java中的新手,有一次我按了一封信我想顯示一些信息,只是爲了驗證代碼工作我想要做的是。使用javax swing庫特別是keylistener和關鍵事件,我不知道我是否正確地做。 這裏是我的代碼:的Java的KeyListener

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.event.KeyListener; 
import java.awt.event.KeyEvent; 
public class KeyStrokeButton{ 
    public JFrame frame; 
    public JPanel panel; 
    public JButton btnfocus, btnrelease, btnwindow, btnancestor; 
    public JTextField text; 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       KeyStrokeButton mydesign = new KeyStrokeButton(); 
       mydesign.design(); 
      } 
     }); 
    } 

    public void design() 
    { 


     panel = new JPanel(); 
     panel.setLayout(null); 

     frame = new JFrame("Keystroke Tutorials"); 
     frame.getContentPane().add(panel); 
     frame.setSize(250, 250); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     btnfocus = new JButton("<html><center>Focus"); 
     btnfocus.setBounds(10, 10, 90, 80); 
     panel.add(btnfocus); 
     btnfocus.addKeyListener(new ClickPressed()); 


     btnrelease = new JButton("Release"); 
     btnrelease.setBounds(110, 10, 90, 80); 
     panel.add(btnrelease); 


     btnancestor = new JButton("Ancestor"); 
     btnancestor.setBounds(10, 100, 90, 80); 
     panel.add(btnancestor); 


     btnwindow = new JButton("Window"); 
     btnwindow.setBounds(110, 100, 90, 80); 
     panel.add(btnwindow); 
    } 
    class ClickPressed implements KeyListener 
    { 
     public void KeyPressed(KeyEvent e) 
     { 
      //any code. 
     } 
    } 
} 

儘可能我要分開我的代碼的事件,所以我創建一個類,使其可讀。

+0

所以你得到的錯誤? (如果沒有,那麼你可能做對了) – 2012-08-14 00:38:28

+0

這是什麼問題? – 2012-08-14 00:39:01

+2

我不認爲你想使用按鈕的KeyListener。您可能需要考慮通過addActionListener方法向您的按鈕添加ActionListeners。 – km1 2012-08-14 01:42:16

回答

4

我不知道您發佈的內容中是否存在潛在的問題。但從您的代碼判斷,這裏有幾個指針:

我希望這將幫助你開始。

6

在這種情況下KeyListener是基於當前焦點。也就是說,關鍵事件將僅傳遞給當前具有焦點的組件。

所以,例如,你有3個按鈕。焦點按鈕只有在焦點時纔會收到關鍵事件。如果其他組件具有焦點,則焦點按鈕將不會接收到關鍵事件。

一般來說,KeyListener s爲不是一個好主意。您正在使用的Key Bindings API

的你正在努力實現將幫助我們進一步什麼更好的解釋好得多。

4

Sujay的回答會給你你需要的所有信息,但這裏是監聽按鍵事件的一個簡單的例子。

您可以通過發射後加入這個全球關鍵監聽器添加到您的JFrame:

KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
manager.addKeyEventDispatcher (new MyDispatcher()); 

然後你需要創建一個關鍵事件調度,並添加您的代碼到它

private class MyDispatcher implements KeyEventDispatcher 
    { 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) 
     { 
      if (e.getKeyCode() == 38) //up key 
      { 
      //Do something when the up key is pressed 
      System.out.println("The up key was pressed"); 
      } 
      else if (e.getKeyCode() == 40) //down key 
      { 
       //Do something when the down key is pressed 
       System.out.println("The down key was pressed"); 
      } 
      return false; 
     } 
    } 
+3

鍵綁定是關鍵聽衆的更好選擇。 – 2012-08-14 01:07:38

0

嘗試使用以下代碼在JFrame中構建KeyListener:設置代碼,以便在按下時檢測輸入和退出鍵。

import java.awt.event.KeyEvent; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyListener; 

class KeyListener extends JFrame implements KeyListener { 

@Override 
public void keyReleased(KeyEvent e) {    // Required for  KeyListener override 

} 
@Override 
public void keyTyped(KeyEvent e) {     // Required for  KeyListener override 

} 
} 
public KeyListener() { 

addKeyListener(this);  // KeyListener added to JFrame to detect key strokes 
setFocusable(true);   // Ensure JFrame can gain focus 

} 

public void keyPressed(KeyEvent e) { // Code to handle when key pressed 
int keyCode = e.getKeyCode(); 
switch(keyCode) { 
case KeyEvent.VK_ENTER:   // Code to handle when enter key pressed 

    // ENTER CODE HERE 

    break; 
case KeyEvent.VK_ESCAPE:  // Code to handle when Escape key pressed 
    // ENTER CODE HERE 
    break; 

}}