2012-05-09 26 views
5

Tôi có một số JPanel, tôi muốn trả lời nhấp chuột và sau đó mở JDialog. Nhà xây dựng JDialog cần một phiên bản JFrame và không phải JPanel - làm cách nào để giải quyết vấn đề này?Khởi tạo JDialog từ JPanel

+2

Bạn đã cân nhắc sử dụng JOptionPane chưa? – ChadNC

Trả lời

1

Có một nhà xây dựng mà không cần đối số:

JDialog dialog = new JDialog(); 

Nếu những gì bạn muốn là làm cho phương thức thoại, có thể bạn có thể nhận được một tài liệu tham khảo tĩnh của bạn JFrame chính, một cái gì đó như:

JDialog dialog = new JDialog(MyMainJFrame.getInstance()); 
3

Sử dụng hàm tạo miễn phí của thông số sẽ làm cho hộp thoại ít chủ sở hữu hơn. Tôi nghĩ rằng điều tốt nhất để làm là làm cho Frame sở hữu Panel của bạn là chủ sở hữu của hộp thoại.

Bằng cách đó, tôi có nghĩa là bạn nên sử dụng getParent() từ JPanel của bạn để tìm chủ sở hữu và sau đó gửi đối tượng này làm chủ sở hữu của JFrame của bạn.

Một mã thô cho rằng sẽ là

java.awt.Container c = myPanel.getParent(); 
while (!(c instanceof javax.swing.JFrame) && (c!=null)) { 
     c = c.getParent(); 
} 
if (c!=null) { 
    JFrame owner=(javax.swing.JFrame) c; 
    JDialog myDialog=new JDialog(owner); 
} 

tôi đã không kiểm tra mã này, nhưng nó là tốt enought để bạn có thể hiểu được ý tưởng.

2

Nếu bạn quyết định đi với một JOptionPane, bạn có thể thêm một MouseListener vào JPanel với một lớp bên trong mouseAdapter để xử lý các sự kiện mouseClicked. Bạn sẽ phải khai báo bảng cuối cùng để truy cập bảng điều khiển từ bên trong lớp bên trong.

final JPanel testPanel = new JPanel(); 

testPanel.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent e) 
    {   
     JOptionPane.showMessageDialog(testPanel,"Title","InformationMessage",JOptionPane.INFORMATION_MESSAGE); 

    }});//end of mouseClicked method 
7

Bạn thực sự nên cố gắng gắn JDialog để một Dialog cha mẹ hoặc Frame, đặc biệt là nếu bạn muốn nó modal (bằng cách thông qua một cửa sổ phụ huynh, hộp thoại sẽ được gắn vào cửa sổ của bạn và đưa phụ huynh sẽ mang lại hộp thoại con cũng vậy). Nếu không, kinh nghiệm người dùng thực sự có thể đi sai: hộp thoại bị mất, ngăn chặn các cửa sổ mà không thấy hộp thoại modal, vv ...

Để tìm mẹ Window JPanel của bạn, bạn chỉ cần có mã này:

JPanel panel = new JPanel(); 
Window parentWindow = SwingUtilities.windowForComponent(panel); 
// or pass 'this' if you are inside the panel 
Frame parentFrame = null; 
if (parentWindow instanceof Frame) { 
    parentFrame = (Frame)parentWindow; 
} 
JDialog dialog = new JDialog(parentFrame); 
... 

Nếu bạn không biết nếu bạn đang ở trong một khung hoặc hộp thoại, hãy làm bài kiểm tra "instanceof" cho cả hai lớp.

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