2009-08-16 28 views
7

Làm cách nào tôi có thể đặt nút hủy trong Swing JDialog, tức là nút có hành động được thực hiện tự động nếu người dùng nhấn phím “Hủy” trên bàn phím?Nút hủy bỏ JDialog

Đối tác được cung cấp cho hành động mặc định qua phương thức setDefaultButton của ngăn gốc của hộp thoại.

Nếu điều đó giúp ích, tôi đang tìm kiếm một điểm tương tự với thuộc tính WinForms Form.CancelButton.

+0

Đoán bạn là phím thoát .. – NateS

Trả lời

1

Tôi không nghĩ rằng điều này là có thể với JDialog mà không mở rộng nó.

Bạn có thể sử dụng JOptionPane.showOptionDialog() (hoặc có thể là một trong các phương thức hiển thị khác), chuyển JButton mà bạn muốn sử dụng.

Nếu các tùy chọn thông qua là những thành phần, họ sẽ được trả lại như bình thường, vì vậy bạn có thể làm một cái gì đó như thế này:

int optionType = JOptionPane.DEFAULT_OPTION; 
int messageType = JOptionPane.PLAIN_MESSAGE; // no standard icon 

JButton ok = new JButton("ok"); 
JButton cancel = new JButton("cancel"); 
//add any handlers to the buttons 
... 
//construct options 
Object[] selValues = { ok, cancel }; 

//show dialog as normal, selected index will be returned. 
int res = JOptionPane.showOptionDialog(null, "message", 
     "title", optionType, messageType, null, selValues, 
     selValues[0]); 
+0

Xin chào, cảm ơn ví dụ. Thật không may, tôi cần một hộp thoại hoàn toàn tùy chỉnh với nhiều điều khiển khác nhau, không chỉ đơn thuần là một hộp thoại tùy chọn được cá nhân hóa. Theo như tôi có thể thấy, không có phương pháp/quá tải có thể được thông qua một bảng điều khiển hoàn toàn tùy chỉnh. –

+1

Tôi nghĩ rằng bạn nói đúng, nếu bạn có một hộp thoại tùy chỉnh, bạn sẽ cần phải thực hiện việc xử lý chính mình, tuy nhiên bạn có thể rip ra chế biến để làm như vậy từ JOptionPane. FWIW trong SWT bạn có thể định nghĩa một lớp con tùy ý của Dialog và gọi phương thức open() của nó để hiển thị nó –

2

giải pháp đơn dòng

t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction()); 

trong đó t là bất kỳ thành phần (ngoại trừ JButton) như JTextField trong hộp thoại.

+1

Đối số thứ hai cho phương thức 'put()' là một khóa vào bản đồ hành động, không phải là 'Hành động'. Điều này sẽ chỉ hoạt động nếu 'btnCancel.getAction()! = Null', và nếu' Action' được trả về bởi 'btnCancel.getAction()' đã được đăng ký trong bản đồ hành động cho 't' với chính nó như là khóa, nghĩa là. nếu 't.getActionMap() đặt (btnCancel.getAction(), btnCancel.getAction())' trước đây đã được gọi. – Jesse

1

Tất cả những gì bạn phải làm là đính kèm trình xử lý tác vụ vào nút và gọi dialog.setVisible(false) bên trong.

+0

Chỉ cần thử ... nó thực sự hoạt động –

+0

Bạn không trả lời câu hỏi. Nó sắp loại bỏ một hộp thoại với một phím tắt, nói chung với phím Escape. Ít nhất đó là cách tôi đọc câu hỏi, một chút mơ hồ khi đọc lại nó. – PhiLho

+0

Rất tiếc, cảm ơn bạn đã chỉ ra điều đó. Câu hỏi nên đọc "khóa" hủy ", không phải" nút ". Tôi sẽ sửa nó. –

3

Cách tốt nhất tôi có thể thấy là thêm Action vào bản đồ hành động của ngăn gốc và liên kết hành động đó với phím thoát bằng cách sử dụng bản đồ đầu vào của ô gốc.

Đối với điều này, bạn cần một Action. (. Tức là cancelButton.getAction() != null) Nếu hành vi nút của bạn hủy được thực hiện như một hành động, thì điều này sẽ làm việc:

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", cancelButton.getAction()); 

Ngược lại, nếu logic nút hủy được thực hiện thông qua một ActionListener, bạn có thể có phương pháp actionPerformed() của ActionListener gọi phương thức private void onCancel() triển khai logic và đăng ký hành động "hủy" gọi cùng một phương thức.

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     onCancel(); 
    } 
});