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
Trả lời
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());
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.
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
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.
- 1. Khởi tạo std :: tuple từ danh sách khởi tạo
- 2. Java - JDialog unmovable
- 3. JOptionPane vs JDialog
- 4. chờ JDialog để đóng
- 5. Làm thế nào để tạo ra một JDialog phương thức trên đầu trang của một JDialog phương thức
- 6. Nút hủy bỏ JDialog
- 7. undecorated JDialog biên giới
- 8. Cách tạo công việc khởi tạo mảng nội tuyến như ví dụ: Khởi tạo từ điển?
- 9. Powermock, Mockito nullpointerexception khi gọi super() JDialog
- 10. Transparent JPanel
- 11. Khởi tạo đối tượng chung từ System.Type
- 12. lớp khởi tạo từ đối tượng lớp
- 13. Khởi tạo một lớp Python từ tên
- 14. java, khởi tạo lớp con từ SuperClass
- 15. addMouseListener cho JPanel
- 16. Tại sao tôi không thể khởi tạo cấu trúc khởi tạo từ cấu trúc khác?
- 17. Tạo biên giới JPanel với tiêu đề như trong Firefox
- 18. Trung tâm JDialog trên bố mẹ
- 19. Lấy đầu vào nhập vào một JDialog
- 20. Tạo trình khởi tạo
- 21. JPanel repaint issue
- 22. Java không thể gọi JDialog đơn giản được xây dựng bằng cách sử dụng eclipse WindowBuilder
- 23. Java/Swing: Nhận Window/JFrame từ bên trong một JPanel
- 24. cách làm cho JDialog không hoạt động
- 25. Xóa nút "X" trong Swing JDialog
- 26. Setting JDialog opacity bởi Hẹn giờ
- 27. JPanel Drop Shadow
- 28. thêm JMenuBar vào JPanel?
- 29. Thêm JFreeChart vào JPanel
- 30. Cuộn một JPanel
Bạn đã cân nhắc sử dụng JOptionPane chưa? – ChadNC