2012-06-04 44 views
9

Tôi đã tạo ra một DialogUtil trong đó cho thấy số lượng JOptionPan trong tình huống khác nhau. đôi khi trong cuộc gọi lớp hành động của tôi với phương pháp này với các tham số null như dưới đây.làm thế nào để hiển thị JOptionPane trên đầu trang của tất cả các cửa sổ

DialogUtil.showNotExist(null,xml.getName().concat(" is null or")); 

Trong trường hợp này JOptionPane không xuất hiện trên đầu cửa sổ.

Tôi làm cách nào để thêm thứ gì đó vào JOptionPane để luôn xuất hiện ở trên cùng?

public static void showNotExist(JPanel panel, String action) { 
    JOptionPane.showMessageDialog(panel, new JLabel(action.concat(" doesn't exist."), 2)); 
} 
+0

Đơn giản chỉ cần vượt qua cha mẹ như một cuộc tranh cãi, thay vì 'JPanel', để cho nó được container chính nghĩa 'JFrame', sau đó bạn thực sự không phải bận tâm về những điều như vậy :-) –

+0

* "đôi khi trong lớp gọi hành động của tôi đến phương thức này với các tham số null như dưới đây." * Tại sao 'null'? –

+1

Vì tôi gọi phương thức này trong phần thân của lớp không có tham chiếu đến GUI hoặc khung. – itro

Trả lời

5

có hai khả năng vấn đề

  • JOptionPane được gọi ra khỏi EDT, sau đó chỉ thanh công cụ (chú thích đi kèm từ OS Native có thể nhìn thấy trên màn hình, RootPane không nhìn thấy được) là có thể nhìn thấy trên màn hình

  • đó bạn có thể để kiểm tra các tính năng JOptionPanes, trong đó JOptionPane.showInternalMessageDialog() gây khó khăn trong mọi trường hợp ere được một JDialog với setModal (true), lý do thực sự tôi không biết, cùng nên với ModalityTypes

  • không thể hiển thị hai JOptionPanes trên màn hình trong cùng một thời gian

đang

import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JButton; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Toolkit; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import javax.swing.JDialog; 
import javax.swing.JOptionPane; 
import javax.swing.JRootPane; 
import javax.swing.Timer; 
//http://stackoverflow.com/questions/8670297/make-java-swing-modal-dialog-behave-like-mac-osx-dialogs 
public class ModalDialogDemoFrame extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private ModalDialogDemoFrame modalDialogDemo; 

    public ModalDialogDemoFrame() { 
     modalDialogDemo = this; 
     setBounds(100, 100, 400, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton buttonDialog = new JButton("Open Dialog"); 
     buttonDialog.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       // Create a Modal Dialog with this Frame as Parent. 
       ModalDialog modalDialog = new ModalDialog(modalDialogDemo, true); 
       modalDialog.setVisible(true); 
      } 
     }); 
     getContentPane().add(buttonDialog, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       try { 
        ModalDialogDemoFrame window = new ModalDialogDemoFrame(); 
        window.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
//http://stackoverflow.com/questions/4577424/distinguish-between-a-single-click-and-a-double-click-in-java/4577475#4577475 
class ClickListener extends MouseAdapter implements ActionListener { 

    private final static int clickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 
    private MouseEvent lastEvent; 
    private Timer timer; 

    public ClickListener() { 
     this(clickInterval); 
    } 

    public ClickListener(int delay) { 
     timer = new Timer(delay, this); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     if (e.getClickCount() > 2) { 
      return; 
     } 
     lastEvent = e; 
     if (timer.isRunning()) { 
      timer.stop(); 
      doubleClick(lastEvent); 
     } else { 
      timer.restart(); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     timer.stop(); 
     singleClick(lastEvent); 
    } 

    public void singleClick(MouseEvent e) { 
    } 

    public void doubleClick(MouseEvent e) { 
    } 
} 

class ModalDialog extends JDialog { 

    private static final long serialVersionUID = 1L; 

    public ModalDialog(JFrame parent, boolean modal) { 
     Dimension dimensionParentFrame = parent.getSize(); 
     setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width/2, 75)); 
     Dimension dimensionDialog = getSize(); 
     int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width)/2); 
     setLocation(x, parent.getY() + parent.getInsets().top); 
     //setUndecorated(true); 
     setModal(modal); 
     //setUndecorated(true); 
     //getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG); 
     setModalityType(ModalityType.APPLICATION_MODAL); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     final JButton buttonClose = new JButton("Close"); 
     buttonClose.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
//ok 
       /*JOptionPane.showMessageDialog(buttonClose, 
       "Eggs are not supposed to be green.", 
       "Inane warning", 
       JOptionPane.WARNING_MESSAGE);*/ 
//uncomment for un_handled GUI, JOptionPane is behing JFrame I think.... 
       /*JOptionPane.showInternalMessageDialog(buttonClose, 
       "Eggs are not supposed to be green.", 
       "Inane warning", 
       JOptionPane.WARNING_MESSAGE);*/ 
//ok 
       /*JOptionPane.showConfirmDialog(buttonClose, 
       "Eggs are not supposed to be green.", 
       "Inane warning", 
       JOptionPane.WARNING_MESSAGE);*/ 
//ok     
       /*JOptionPane.showMessageDialog(null, 
       "Eggs are not supposed to be green.", 
       "Inane warning", 
       JOptionPane.WARNING_MESSAGE);*/ 
//uncomment for un_handled GUI 
//Exception occurred during event dispatching: 
//java.lang.RuntimeException: JOptionPane: parentComponent does not have a valid parent     
       /*JOptionPane.showInternalMessageDialog(null, 
       "Eggs are not supposed to be green.", 
       "Inane warning", 
       JOptionPane.WARNING_MESSAGE);*/ 
//ok     
       JOptionPane.showConfirmDialog(null, 
         "Eggs are not supposed to be green.", 
         "Inane warning", 
         JOptionPane.WARNING_MESSAGE); 
       dispose(); 
      } 
     }); 
     add(buttonClose, BorderLayout.CENTER); // comment for listening 
     addMouseListener(new ClickListener() { 

      @Override 
      public void singleClick(MouseEvent e) { 
       System.out.println("single"); 
      } 

      @Override 
      public void doubleClick(MouseEvent e) { 
       System.out.println("double"); 
      } 
     }); 
    } 
} 
+0

@Downvoter: Hãy quan tâm để giải thích lý do cũng cho việc làm !!! –

4

Tôi không biết những gì WebOptionPane hoặc WebPanel đang có, nhưng nếu họ đang dựa trên JOptionPane thì vấn đề là bạn đang đi qua null cho rằng lập luận đầu tiên với phương pháp showXXX(). Nếu bạn muốn JOptionPane trở thành phương thức - buộc phải đặt trước cửa sổ được chỉ định - thì bạn cần chỉ định cửa sổ (ví dụ: JFrame - đối với đối số đầu tiên đó.

+0

+1 gợi ý đúng Tôi đã thêm phần còn lại của – mKorbel

+0

Bạn nói đúng và tôi biết về nó nhưng tôi muốn ở trên đầu những gì bao giờ hết là đối số đầu tiên và không chỉ định một cửa sổ? – itro

+0

@itro: Và tôi muốn có một con kỳ lân! –

14

Bạn đã thử một cái gì đó như thế này?

JOptionPane optionPane = new JOptionPane(); 
JDialog dialog = optionPane.createDialog("Title"); 
dialog.setAlwaysOnTop(alwaysOnTop); 
dialog.setVisible(true); 

Không có gì đảm bảo rằng hệ điều hành sẽ cho phép hộp thoại của bạn luôn ở trên cùng nhưng nó thường hoạt động.

Nếu bạn có một cửa sổ hiện tại hoặc hộp thoại và bạn muốn mang nó đến đỉnh, nhưng không muốn để thiết lập vĩnh viễn alwaysOnTop, điều này sẽ làm việc trong khi rời khỏi giá trị cũ của alwaysOnTop một mình:

boolean supported = window.isAlwaysOnTopSupported(); 
boolean old_alwaysOnTop = window.isAlwaysOnTop(); 
if (supported) { 
    window.setAlwaysOnTop(true); 
} 
window.toFront(); 
window.requestFocus(); 
if (supported) { 
    window.setAlwaysOnTop(old_alwaysOnTop); 
} 

Chỉ chạy mã đó trên SwingThread.

1
public static void showNotExist(JPanel panel, String action) { 
    JOptionPane.showMessageDialog(rootPane, new JLabel(action.concat(" doesn't exist."), 2)); 
} 

Cố gắng đưa ra các rootpane như giá trị 1 trong phần showMessageDialog

1

Nếu lớp học của bạn đã mở rộng JFrame, sau đó chỉ đơn giản là thiết lập các tài sản setAlwaysOnTop lớp (true); ở bất kỳ đâu trong các hàm tạo trước hàm JOptionPane.showMessageDialog (null, "OKay");

Tôi sử dụng nó để sao chép tệp và kiểm tra, thậm chí không cần JFrame nhưng JOptionPane.

P.S.Nếu bạn không muốn JFrame chính luôn hiển thị ở trên cùng, thì bạn cần tạo JFrame giả hoặc thiết lập lại thuộc tính setAlwaysOnTop (false); sau JOptionPane.

1

Bạn có thể đặt JOptionPane luôn luôn trên đầu bằng cách sử dụng mã này: -

 JFrame jf=new JFrame(); 
     jf.setAlwaysOnTop(true); 
     int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
Các vấn đề liên quan