2012-02-17 42 views
6
public class MyPanel extends JPanel implements KeyListener { 
    private char c = 'e'; 
    public MyPanel() { 
     this.setPreferredSize(new Dimension(500,500)); 
     addKeyListener(this); 
    } 
    public void paintComponent(Graphics g) { 
     super.repaint(); 
     g.drawString("the key that pressed is" + c, 250,250); 
    } 

    public void keyPressed(KeyEvent e) { 
     c=e.getKeyChar(); 
     repaint(); 

    } 

    public void keyReleased(KeyEvent e) { 
    } 


    public void keyTyped(KeyEvent e) { 
     c=e.getKeyChar(); 
     repaint(); 
    } 

    public static void main(String[] s) { 
     JFrame f=new JFrame(); 
     f.getContentPane().add(new MyPanel()); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

Tôi đã cố gắng đọc this nhưng không mange để hiểu làm thế nào để chỉ đơn giản là thực hiện một KeyListener. vì vậy tôi cần phải thay đổi điều này để làm việc?cách đơn giản triển khai KeyListener?

+0

Bạn mong đợi hành vi nào từ chương trình làm việc? Nếu bạn muốn thay đổi chuỗi trên màn hình mỗi lần người dùng nhấn một phím, một cuộc gọi đơn giản tới 'repaint()' sau mỗi lần sửa đổi thành 'c' sẽ thực hiện thủ thuật. –

+0

vâng tôi quên thêm nó, nhưng nó không hoạt động anyway ... –

Trả lời

9

Dưới đây là những lý do tại sao nó không hoạt động:

  1. Các JPanel không có sự tập trung bàn phím. (Khung có nó.) Bạn có thể muốn requestFocus khi bảng điều khiển được thêm vào màn hình.

  2. Bạn cần gọi repaint khi đồ họa sẽ thay đổi.

  3. Bạn không được gọi repaint theo phương thức paintComponent.

  4. Bạn cần xóa khu vực vẽ trước khi vẽ lại chuỗi (nếu không tất cả các ký tự sẽ kết thúc với nhau).

Dưới đây là một ví dụ làm việc hoàn chỉnh:

class MyPanel extends JPanel implements KeyListener { 
    private char c = 'e'; 

    public MyPanel() { 
     this.setPreferredSize(new Dimension(500, 500)); 
     addKeyListener(this); 
    } 

    public void addNotify() { 
     super.addNotify(); 
     requestFocus(); 
    } 

    public void paintComponent(Graphics g) { 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.drawString("the key that pressed is " + c, 250, 250); 
    } 

    public void keyPressed(KeyEvent e) { } 
    public void keyReleased(KeyEvent e) { } 
    public void keyTyped(KeyEvent e) { 
     c = e.getKeyChar(); 
     repaint(); 
    } 

    public static void main(String[] s) { 
     JFrame f = new JFrame(); 
     f.getContentPane().add(new MyPanel()); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

Oh, và bạn có thể muốn thêm f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) để làm cho ứng dụng chấm dứt khi bạn đóng cửa sổ. :-)

+2

addNotify() là những gì tôi đã mất tích! cảm ơn!!! –

+1

Đây là những gì tôi gọi là một ví dụ tuyệt vời !! – Yster

Các vấn đề liên quan