2012-06-04 31 views
9

He creado un DialogUtil que muestra los números de JOptionPan en diferentes situaciones. a veces en mi llamada de clase de acción a este método con parámetros nulos como a continuación.cómo mostrar JOptionPane en la parte superior de todas las ventanas

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

En este caso JOptionPane no aparece en la parte superior de la ventana.

¿Cómo puedo agregar algo a JOptionPane para que aparezca siempre en la parte superior?

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

simplemente pasan a la matriz como un argumento, en lugar de 'JPanel', que sea el contenedor principal, es decir' JFrame', entonces realmente no tiene que preocuparse por tales cosas :-) –

+0

* "a veces en mi llamada de clase de acción a este método con parámetros nulos como a continuación." * ¿Por qué 'null'? –

+1

Porque llamo a este método en el cuerpo de una clase que no tiene referencia a GUI o marco. – itro

Respuesta

5

hay dos posibles cuestiones

  • JOptionPane se llama fuera de EDT, entonces sólo la barra de herramientas (leyenda que venía de sistema operativo nativo es visible en la pantalla, RootPane no es visible) es visible en la pantalla

  • allí se puede para probar las características de JOptionPanes, donde JOptionPane.showInternalMessageDialog() crea problemas en todos los casos que ERE es otro JDialog con setModal (verdadero), verdadera razón de que no sé, el mismo debe ser con ModalityTypes

  • no

    posible que muestra dos JOptionPanes en la pantalla al mismo tiempo código

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: ¡Por favor, cuídese de interpretar el motivo también de los hechos! –

4

no sé lo que WebOptionPane o WebPanel son, pero si están basados ​​en JOptionPane, entonces el problema es que estás pasando null para ese primer argumento del método showXXX(). Si desea que el JOptionPane sea modal, lo que lo obliga a estar frente a una ventana especificada, debe especificar una ventana (es decir, un JFrame) para ese primer argumento.

+0

+1 sugerencia correcta He añadido el resto de – mKorbel

+0

Tiene razón y estoy al tanto, pero quiero estar arriba ¿cuál es el primer argumento y sin especificar una ventana? – itro

+0

@itro: ¡Y quiero un unicornio! –

14

¿Has probado algo como esto?

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

No hay garantía de que el sistema operativo permita que su diálogo siempre esté en la parte superior, pero a menudo funcionará.

Si usted tiene una ventana o cuadro de diálogo existente y desea llevarlo a la cima, pero no desea establecer de forma permanente AlwaysOnTop, esto debería funcionar, dejando el antiguo valor de AlwaysOnTop solo:

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

Ejecuta ese código solo en SwingThread.

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

tratar de darle a la RootPane como el primero valor en la sección showMessageDialog

1

Si la clase JFrame se ha extendido, a continuación, sólo basta con establecer la propiedad setAlwaysOnTop clase (true); en cualquier lugar de los constructores antes de JOptionPane.showMessageDialog (null, "OKay");

Lo uso para copiar archivos y comprobar, ni siquiera necesito un JFrame, pero JOptionPane.

P.S.Si no desea que el JFrame principal siempre aparezca en la parte superior, entonces necesita crear JFrame ficticio o restablecer la propiedad setAlwaysOnTop (false); después del JOptionPane.

1

Puede establecer JOptionPane siempre en la parte superior mediante el uso de este código: -

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