2012-06-04 18 views
9

Ho creato un DialogUtil che mostra i numeri di JOptionPan in situazioni diverse. a volte nella mia chiamata di classe di azione a questo metodo con parametri null come sotto.come mostrare JOptionPane nella parte superiore di tutte le finestre

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

In questo caso JOptionPane non viene visualizzato nella parte superiore della finestra.

Come posso aggiungere qualcosa a JOptionPane per apparire sempre in alto?

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

semplicemente passare il genitore come argomento, invece di 'JPanel', lascia che sia il contenitore principale cioè' JFrame', allora si davvero non deve preoccuparsi di cose del genere :-) –

+0

* "a volte nella mia chiamata di classe di azione a questo metodo con parametri null come di seguito." * Perché 'null'? –

+1

Perché chiamo questo metodo nel corpo di una classe che non ha riferimenti alla GUI o al frame. – itro

risposta

5

sono possibili due problemi

  • JOptionPane è chiamato fuori EDT, allora solo barra degli strumenti (voce che proveniva dal sistema operativo nativo è visibile sullo schermo, RootPane non è visibile) è visibile sullo schermo

  • lì si può per testare le funzionalità di JOptionPanes, dove JOptionPane.showInternalMessageDialog() crea problemi in tutti i casi che ere è un'altra JDialog con setModal (vero), vera ragione non so, lo stesso dovrebbe essere con ModalityTypes

  • non

    possibile che mostra due JOptionPanes sullo schermo nello stesso tempo il codice

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: Si prega di interpretare il motivo anche per le azioni !!! –

4

non so cosa WebOptionPane o WebPanel sono, ma se sono basate su JOptionPane, allora il problema è che si sta passando null per quel primo argomento del metodo showXXX(). Se si desidera che lo JOptionPane sia modale, il che obbliga a trovarsi di fronte a una finestra specificata, è necessario specificare una finestra (ad esempio, JFrame per il primo argomento:

+0

+1 suggerimento di destra Ho aggiunto il resto di – mKorbel

+0

Hai ragione e ne sono a conoscenza ma voglio essere in cima a ciò che è sempre il primo argomento e senza specificare una finestra? – itro

+0

@itro: E voglio un unicorno! –

14

Hai provato qualcosa del genere?

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

v'è alcuna garanzia che il sistema operativo sarà permettere che la tua finestra di essere sempre in primo piano, ma spesso lavorano.

Se si dispone di una finestra o finestra esistente e si desidera portare al top, ma non si desidera impostare in modo permanente AlwaysOnTop, questo dovrebbe funzionare, lasciando il vecchio valore di AlwaysOnTop sola:

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

Esegui quel codice solo su SwingThread.

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

Provare a dare il rootpane come il primo valore nella sezione showMessageDialog

1

Se la classe ha esteso JFrame, poi semplicemente impostare la proprietà setAlwaysOnTop classe (true); in qualsiasi parte dei costruttori prima di JOptionPane.showMessageDialog (null, "OKay");

Lo uso per copiare file e controllare, non ho nemmeno bisogno di un JFrame ma JOptionPane.

P.S.Se non si desidera che JFrame principale venga sempre visualizzato in alto, è necessario creare fittizio JFrame o ripristinare la proprietà setAlwaysOnTop (false); dopo il JOptionPane.

1

È possibile impostare JOptionPane sempre in primo piano utilizzando questo codice: -

 JFrame jf=new JFrame(); 
     jf.setAlwaysOnTop(true); 
     int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
Problemi correlati