2011-01-16 36 views

Trả lời

10

JRootPane có phương thức setDefaultButton (nút JButton) sẽ thực hiện những gì bạn muốn. Nếu ứng dụng của bạn là JFrame, nó triển khai giao diện RootPaneContainer và bạn có thể lấy ngăn gốc bằng cách gọi hàm getRootPane() trên JFrame, sau đó gọi setDefaultButton trên ngăn gốc đã được trả về. Kỹ thuật tương tự hoạt động cho JApplet, JDialog hoặc bất kỳ lớp nào khác thực hiện RootPaneContainer.

+0

Điều này chỉ hoạt động sau khi bạn đã khởi tạo thành phần mà bạn dự định .getRootPane() bật không? Nếu vậy, điều đó có nghĩa là tôi không thể xây dựng trực tiếp điều này vào hàm tạo của thành phần đó, đúng không? –

+0

@LucasMorgan: bạn cần JRootPane để làm việc này và điều đó có ý nghĩa. Khác bạn có thể cần phải sử dụng các ràng buộc chính. –

2

Loại bỏ các ActionListeners. Đó là phong cách cũ để làm người nghe. Tốt nghiệp lớp Hành động. Bí quyết là hiểu InputMaps và ActionMaps hoạt động. Đây là một tính năng độc đáo của Swing mà thực sự là khá đẹp:

http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

Đây là cách bạn làm điều đó:

JPanel panel = new JPanel(); 
panel.setLayout(new TableLayout(...)); 
Action someAction = new AbstractAction("GO") { 
    public void actionPerformed() { 
    } 
}; 

InputMap input = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

input.put(KeyStroke.getKeyStroke("enter", "submit"); 
panel.getActionMap().put("submit", someAction); 

panel.add(button = new JButton(someAction)); 
panel.add(textField = new JTextField()); 

Sử dụng WHEN_ANCESTOR_OF_FOCUSED_COMPONENT cho phép bảng điều khiển để nhận các sự kiện bàn phím từ bất kỳ đó là con (tức là tổ tiên). Vì vậy, không có vấn đề gì thành phần đã tập trung miễn là nó bên trong bảng điều khiển mà tổ hợp phím sẽ gọi bất kỳ hành động đăng ký dưới "gửi" trong ActionMap.

Điều này cho phép bạn sử dụng lại Tác vụ trong menu, nút hoặc tổ hợp phím bằng cách chia sẻ chúng.

+0

Ràng buộc khóa rất hữu ích trong nhiều trường hợp nhưng không phải là một chút quá mức cần thiết cho vấn đề hiện tại khi bạn có thể sử dụng các giải pháp đơn giản khác được cung cấp (có khả năng sử dụng khóa ràng buộc trong nền). –

+0

Tùy thuộc vào tác giả đã không chỉ định nếu điều này là trên một hộp thoại của chính nó, hoặc giao diện người dùng chính. Sử dụng setDefaultButton() giả định đó là điều duy nhất trên một hộp thoại. Chưa kể đến các hành động hiểu biết và cách chúng liên quan đến phần còn lại của bộ công cụ Swing sẽ đưa bạn vào các chủ đề khác như ràng buộc trình đơn, tổ hợp phím toàn cục và tùy chỉnh ánh xạ khóa cho các thành phần mặc định. Thêm vào đó, bất cứ ai sử dụng ActionListeners cần phải nhận thức được Hành động vượt trội trong mọi trường hợp. – chubbsondubs

+0

"bất kỳ ai sử dụng ActionListeners cần phải lưu ý Hành động vượt trội trong mọi trường hợp." - Hm, và tôi được dạy rằng mọi sự khái quát đều sai. :) –

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