2009-06-02 27 views
52

Có cách nào để xóa nút đóng ("X") khỏi thanh tiêu đề JDialog không?Xóa nút "X" trong Swing JDialog

+7

Tôi đã thấy một số ứng dụng hiển thị hộp thoại khác nếu bạn bấm vào nút đóng bảo bạn nhấn một trong các nút khác để thay thế. Thiên tài! –

Trả lời

1

Khi được đoán, hãy đặt nó là PL & F được trang trí và xóa thành phần theo tên.

+1

PL & F là gì? Cảm ơn. – kenshinji

+0

PL & F là cái nhìn & cảm giác dễ chịu. Các cách xấu xí Swing có thể mất trên một Look & Feel tùy ý. –

+2

Tại sao xấu xí? Điều gì sẽ là cách chính xác để làm điều đó? –

53

Bạn có thể xóa toàn bộ tiêu đề hộp thoại bằng cách gọi thoại.setUndecorated (true) nhưng điều này có nghĩa là hộp thoại không thể di chuyển được nữa.

Bạn cũng có thể thực hiện dialog.setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE) để ngăn chặn nút đó hoạt động.

Bên cạnh đó, tôi không nghĩ rằng có một cách để xóa X hoàn toàn.

13

Tôi tin rằng bạn có thể gọi dialog.setUndecorated(true) để xóa thanh tiêu đề. Không chắc chắn về chỉ là 'X' mặc dù.

Xóa 'X' có thể không phải là một ý tưởng tuyệt vời, vì bạn muốn người dùng của mình có thể dễ dàng đóng hộp thoại.

Đặt cược tốt nhất là kiểm soát những gì xảy ra khi người dùng nhấp vào 'X' bằng cách sử dụng dialog.setDefaultCloseOperation hoặc WindowListener.

9

Kể từ Java 1.7 (AKA Dolphin hoặc Java 7), bạn không thể tắt hoặc xóa nút đóng trên Cửa sổ. Bạn có thể xóa/vô hiệu hóa nút phóng to với frame.setResizable(false) và bạn có thể xóa các nút thu nhỏ và tối đa hóa bằng cách sử dụng một số java.awt.Dialog hoặc một lớp mở rộng nó, chẳng hạn như javax.swing.JDialog. Bạn có thể xóa thanh tiêu đề, đường viền và các nút bằng frame.setUndecorated(true) và bạn có toàn quyền kiểm soát mức hiển thị của tất cả các nút trong thanh tiêu đề (trong khi mất một số tương thích nền tảng và tích hợp hệ điều hành) với frame.setDefaultLookAndFeelDecorated(true) (giả sử đó là JFrame hoặc JDialog). Đây là tất cả điều khiển tôi thấy có thể với JDK hiện tại.

+4

Đây là "sẽ không sửa" trên [lỗi diễu hành] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5085932). –

+0

Điều này không hoàn toàn chính xác. Phân lớp/instantiating một JDialog trên OS X (thử nghiệm trên El Capitan) không loại bỏ bất kỳ nút nào từ thanh tiêu đề, cũng không có bất kỳ sự kết hợp nào của cài đặt (và có, tôi đã thử mọi kết hợp). Chỉ 'setUndecorated (true)' loại bỏ tất cả chúng, nhưng cùng với nó đi thanh tiêu đề. Bạn chắc chắn có thể sửa đổi hành vi của các nút trên thanh tiêu đề, nhưng đối với giao diện ...đó là một tình huống rất khó khăn mà tôi đã dành quá nhiều thời gian vào w/giải pháp không đạt yêu cầu và mã không di động. – EntangledLoops

+0

@EntangledLoops Cảm ơn bạn đã đóng góp ý kiến! Mặc dù đúng là JDialog không _remove_ các nút thu nhỏ/"tối đa hóa" trên các hộp thoại OS X, nó sẽ vô hiệu hóa một nút giảm thiểu. Tôi không có một máy Mac trong tay để kiểm tra điều này nhưng tôi sẵn sàng đặt cược nút tối đa chỉ cần thay đổi kích thước nó, và nếu bạn đặt 'dialog.setResizable (false)', nút màu xanh lá cây cũng sẽ bị vô hiệu hóa! Dù sao, như tôi đã nói trong câu trả lời của tôi, nó rất khó chịu khi chúng tôi không có toàn quyền kiểm soát điều này, nhưng tôi có thể tưởng tượng ra cách mà những người sáng tạo JSE có thể lập trình cho tất cả các nền tảng. 3 – Supuhstar

-3
static public void removeButtons(Component c){ 
    if (c instanceof AbstractButton){ 
     String accn = c.getAccessibleContext().getAccessibleName(); 
     Container p=c.getParent(); 
     //log.debug("remove button %s from %s",accn,p.getClass().getName()); 
     c.getParent().remove(c); 
    } 
    else if (c instanceof Container){ 
     //log.debug("processing components of %s",c.getClass().getName()); 
     Component[] comps = ((Container)c).getComponents(); 
     for(int i = 0; i<comps.length; ++i) 
      removeButtons(comps[i]); 
    } 
} 
+7

điều này sẽ xóa bất kỳ nút nào được thêm vào hộp thoại, chứ không phải nút đóng hộp thoại. –

+0

Điều này không ảnh hưởng đến các nút trên thanh tiêu đề (OS X). – EntangledLoops

+1

Điều này thực sự khá buồn cười và khiến ứng dụng của bạn ở trạng thái không vui nhộn nếu bạn _ever_ sử dụng các nút x3 – Supuhstar

4

Dưới đây là kinh nghiệm của tôi:

  • Cố gắng sử dụng setUndecorated(true): Made toàn bộ Dialog vô hình.
  • Đã thử setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE): Điều này hoàn toàn không thay đổi hành vi. Hộp thoại của tôi vẫn đóng. Đặt hoạt động đóng mặc định thành DO_NOTHING_ON_CLOSE ủy quyền hoạt động gần với phương thức windowClosing() của đăng ký WindowListener.

gì làm việc cho tôi là:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
//Remove any existing WindowListeners 
for (WindowListener wl : this.getWindowListeners()) 
     this.removeWindowListener(wl); 
this.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
       if ("Optional condition") { 
         JOptionPane.showMessageDialog(null, "You cannot close this window"); 
       } 
     } 
}); 
Các vấn đề liên quan