2013-04-29 37 views
5

Tôi thấy đoạn mã sau vào một dự án GUI/Swing Java:Mã Swing này hoạt động như thế nào?

MyDialog dlg = new MyDialog(parent, isFizz); 
MyDialogResults results = dlg.getResults(); 

eventBus.fireEvent(new MyDialogEvent(results)); 

Trong đoạn mã trên, MyDialog extends JDialog. Vì vậy, rõ ràng, một hộp thoại con đang được xây dựng (và bằng cách nào đó được hiển thị cho người dùng cuối), sau đó khi người dùng thoát hộp thoại (bằng cách nhấp vào OK hoặc một số nút khác), một hạt results được sử dụng để kích hoạt sự kiện mới trong sự kiện xe buýt.

Nhưng tôi phải vật lộn với hai điều:

  1. Làm thế nào/nơi đang Java được nói để thực sự vẽ/hiển thị hộp thoại để người dùng ?; và
  2. Làm cách nào/ở đâu Java được yêu cầu treo/đợi người dùng thoát khỏi hộp thoại trước khi kích hoạt sự kiện lên xe buýt?

Có phải là con JDialog sẽ luôn hiển thị hộp thoại khi JDialog được tạo và không trả về từ hàm tạo cho đến khi hộp thoại thoát ra? Dưới đây là tóm tắt của HTE MyDialog constructor với phần trên:

public class MyDialog extends JDialog { 
    private boolean isFizz; 
    private MyDialogResults results; 

    // Getters and setters for all properties... 

    public MyDialog(Frame parent, boolean isFizz) { 
     super(parent, "My Dialog", true); 

     setIsFizz(isFizz); 

     setVisible(true); 
     dispose(); 
    } 
} 

Cảm ơn trước sự giúp đỡ nào/cái nhìn sâu sắc với sự hiểu biết như thế nào hộp thoại mở ra, "treo" (mặc dù tôi biết nó không thực sự treo/đông lạnh), đóng lại, và sau đó kích hoạt sự kiện.

Trả lời

1

1)

setVisible(true); 

2)

super(parent, "My Dialog", true); 

Đọc JavaDocs cho JDialog để biết thêm chi tiết.

có liên quan nhất là:

+0

Cảm ơn @Andrew Thompson (+1) - tuy nhiên đối với # 2 tôi vẫn còn bối rối. Theo [constructor Javadoc] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JDialog.html#JDialog%28java.awt.Dialog,%20java.lang.String,% 20boolean% 29) đặt 'modal' thành true only" chặn người dùng nhập vào các cửa sổ cấp cao nhất khác khi được hiển thị ". Nhưng đó không giống như những gì tôi mô tả ở đây. Tôi không tin rằng điều đó sẽ ngăn chặn dòng mã tiếp theo ('MyDialogResults results = dlg.getResults();') thực hiện cho đến khi hàm tạo hoàn thành, vì đó không phải là "đầu vào của người dùng". –

+1

"true" trong cuộc gọi siêu làm cho các phương thức hộp thoại. Điều đó có nghĩa là cuộc gọi đến 'setVisible (true)' sẽ không trở lại cho đến khi hộp thoại được đóng lại. –

+0

* "" chặn người dùng nhập vào các cửa sổ cấp cao nhất khác khi được hiển thị "* ..và dừng dòng mã tiếp theo từ thực thi (là những gì nên được thêm vào đó). –

1

Dialog.setVisible() là phương pháp cho thấy hộp thoại và các khối cho đến khi hộp thoại được đóng lại. Xem số documentation for Dialog. vứt bỏ() sau đó phá hủy đối tượng hộp thoại.

Vì vậy, dự đoán của bạn đã chính xác một phần. Nhà xây dựng đang hiển thị hộp thoại, chặn cho đến khi nó được đóng lại, và sau đó phá hủy hộp thoại sau đó. Tuy nhiên, đây là một tính năng của "MyDialog", không phải của JDialog

+0

Hộp thoại không bị hủy cho đến khi thể hiện dlg nằm ngoài phạm vi. Đó là lý do tại sao bạn có thể truy xuất các giá trị từ hộp thoại sau khi người dùng nhấn nút OK. Có phải là một kiểm tra cho nút Cancel sau khi dòng constructor thoại là tốt. –

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