2014-02-08 31 views
2

我有一段Java練習使用KeyListeners,我一直堅持使用它。任何幫助將不勝感激。練習是:在Java GUI中顯示在鼠標位置鍵入的字符

「編寫一個程序,從鍵盤獲取字符輸入並顯示鼠標指向的字符。」

我做了一些調試,看起來像KeyListener從不註冊時按下一個鍵。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class EventProgrammingExercise10 extends JFrame { 

    CharPanel chars; 
    private int x; 
    private int y; 
    String s; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        EventProgrammingExercise10 frame = new EventProgrammingExercise10(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public EventProgrammingExercise10() { 
     setTitle("EventProgrammingExercise10"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(300, 300); 
     chars = new CharPanel(); 

     chars.addKeyListener(new KeyAdapter() { 

      public void keyPressed(KeyEvent e) { 
       chars.repaint(); 
      } 

     }); 

     add(chars); 
    } 

    public void setX(int n) { 
     x = n; 
    } 

    public void setY(int n) { 
     y = n; 
    } 

    class MouseLocListener extends MouseMotionAdapter { 

     public void mouseMoved(MouseEvent e) { 
      setX(e.getX()); 
      setY(e.getY()); 
     } 

    } 

    class CharPanel extends JPanel { 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawString(String.valueOf('a'), x, y); 
     } 

    } 

} 

謝謝。

回答

2

看@Hovercraft,你忘了加MouseLocListener。比它的作品:)

chars.addMouseMotionListener(new MouseLocListener()); 
chars.setFocusable(true); 
chars.requestFocusInWindow(); 
+0

感謝您的幫助。 –

-1

它看起來像你應該附加lKeyListener不是字符面板,而是框架本身。

這種方式KeyListener即使因任何原因導致面板損失集中,也可以工作。

+0

*「這種方式KeyListener將通用工作,即使面板損失集中出於任何原因」*不,它不會。竊取焦點的組件將阻止任何其他關鍵偵聽器得到通知。如果將另一個組件放置在能夠保持鍵盤焦點的框架上(如JTable),該框架將永遠不會接收鍵盤焦點,不必介意它不可聚焦(從少數鍵盤投入)以啓動與... – MadProgrammer

4

一個KeyListener的只會工作,如果擁有它具有焦點的組件。您必須先使您的JPanel可調焦,即setFocusable(true),然後請求它具有焦點,即requestFocusInWindow()

我根本不會使用MouseListener。我會做,如果我不得不使用的KeyListener,和我所知道的作品,應該是:

  • 讓我的JPanel調焦,並有重點
  • 給它一個BufferedImage,這正是它的大小和得出這樣的在其paintComponent方法。
  • 添加的KeyListener/KeyAdapter它
  • 在KeyAdapter,keyPressed方法,使用的MouseInfo類來獲得一個PointerInfo對象:通過pInfo.getLocation();
  • PointerInfo pInfo = MouseInfo.getPointInfo()
  • 使用PointerInfo在屏幕上取得當前鼠標的位置
  • 獲取圖紙JPanel的位置在屏幕上。
  • 將鼠標指針位置轉換爲與使用簡單矢量圖形的組件相對應的位置。
  • 如果這個點中的位置界限,從BufferedImage的
  • 得到一個圖形對象繪製字符在BufferedImage中
  • 重畫的JPanel
+0

謝謝,這是非常有益的。 –

+0

如果能幫助解決問題,請[接受](http://meta.stackexchange.com/a/65088/155831)。 –