2010-01-25 6 views
17

Tôi có một số JPanel bên trong một JFrame. Tôi đã đăng ký KeyListener, dựa trên đó tôi muốn cập nhật JPanel. Vấn đề tôi gặp phải là tôi không thể tập trung vào số JPanel và do đó, KeyListener của tôi sẽ không hoạt động. Tôi đã biết rằng KeyListener là chức năng vì tôi đã đăng ký nó với JFrame và nó hoạt động tốt. Mã của tôi có dạng như sau:Lấy tiêu điểm trên JPanel

myFrame.setFocusable(false); 
myPanel.setFocusable(true); 
myPanel.addKeyListener(myKL); 
myFrame.add(myPanel); 

Có ai gặp phải vấn đề như thế này trước đây không? Có điều gì tôi thiếu trong trường hợp này?

P .: Tôi không có bất kỳ thành phần bên trong JPanel Tôi chỉ vẽ một hình ảnh trên nền, vì vậy tôi cần tập trung để được trên chính JPanel và không phải trên một cái gì đó bên trong nó.

+1

Hmm, với việc thêm myPanel.requestFocus() hoạt động này đối với tôi. Bạn đang chạy phiên bản Java nào? –

+1

Có thể đăng một SSCCE (ví dụ đơn giản chứa compilable) mà tái tạo này. Điều đó sẽ cung cấp cho người khác một cái gì đó để làm việc w/để giúp đỡ. Tôi cũng đã thông báo w/một vấn đề bằng cách thu hẹp nó xuống phạm vi nhỏ nhất, đôi khi tôi có thể tự tìm ra giải pháp. – broschb

Trả lời

21

Mặc dù bạn cho biết rằng bảng có thể được đặt tiêu điểm, bảng điều khiển không yêu cầu lấy nét. Hãy thử sử dụng myPanel.requestFocus();.

+0

Cảm ơn câu trả lời của bạn. Đã thử cả requestFocus() và requestFocusInWindow(), cả hai đều không làm cho Bảng điều khiển lấy tiêu điểm. Bạn có bất cứ lời đề nghị khác? –

+1

Nó có thể phụ thuộc vào thời điểm bạn gọi nó. Đừng gọi nó trong constructor của JPanel, ví dụ, vì nó được gọi trước khi bảng điều khiển được hiển thị. –

+0

Cảm ơn bạn David, câu trả lời này làm việc cho tôi, tôi không có ý tưởng rằng tôi không thể thực hiện cuộc gọi từ các nhà xây dựng. Ngay sau khi tôi di chuyển requestFocus() đến một phương thức đã được gọi sau khi màn hình hiển thị trên màn hình nó hoạt động hoàn hảo. –

1

Đôi khi tôi gặp phải sự cố tương tự. Tôi đã nhận thấy rằng trong một số trường hợp, tốt hơn là thực hiện hoặc yêu cầu tập trung vào một điều khiển cụ thể trong bảng nằm trong khung (ví dụ: hộp nhập mà bạn muốn nhập bàn phím), thay vì yêu cầu lấy nét cho cửa sổ chính nó.

+0

hoàn toàn đồng ý. –

1

Hãy thử

panel.setFocusable(true); 
panel.setRequestFocusEnabled(true); 

// some code here 

panel.grabFocus(); 
6

Sử dụng setFocusable(true) và sau đó requestFocusInWindow(). Nhưng sau đó phải được thực hiện sau cửa sổ chứa bảng điều khiển được hiển thị, bạn có thể cần phải đăng ký trình nghe cửa sổ và làm requestFocusInWindow() trong mã trình xử lý được kích hoạt của cửa sổ.

Lưu ý: Đặc biệt sau khi cửa sổ có thể nhìn thấy, không chỉ sau khi gọi setVisible(true).

1

Hãy thử một cái gì đó như thế này:

myFrame.addFocusListener(new FocusAdapter() { 

     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public void focusGained(FocusEvent aE) { 
      myPanel.requestFocusInWindow(); 
     } 
    });