como mostrar JOptionPane no topo de todas as janelas

Eu criei um DialogUtil que mostra números de JOptionPan em situação diferente. às vezes na minha class de ação chamada para este método com parâmetros nulos como abaixo.

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

Neste caso, JOptionPane não aparece no topo da janela.

Como posso adicionar algo ao JOptionPane para aparecer sempre no topo?

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

existem dois problemas possíveis

  • JOptionPane é chamado de EDT, então apenas barra de ferramentas (legenda que veio do sistema operacional nativo é visível na canvas, RootPane não é visível) é visível na canvas

  • lá você pode testar os resources de JOptionPanes, onde JOptionPane.showInternalMessageDialog () faz problemas em todos os casos em que há outro JDialog com setModal (true), a verdadeira razão que eu não sei, o mesmo deve ser com ModalityTypes

  • não é possível mostrar dois JOptionPanes na canvas ao mesmo tempo

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"); } }); } } 

Você já tentou algo assim?

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

Não há garantia de que o sistema operacional permitirá que sua checkbox de diálogo esteja sempre no topo, mas geralmente funcionará.

Se você tem uma janela ou checkbox de diálogo existente e quer trazê-la para o topo, mas não deseja definir permanentemente o alwaysOnTop, isso deve funcionar deixando o valor antigo de alwaysOnTop sozinho:

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

Execute esse código apenas no SwingThread.

Eu não sei o que WebOptionPane ou WebPanel são, mas se eles são baseados em JOptionPane , então o problema é que você está passando null para o primeiro argumento para o método showXXX() . Se você quer que o JOptionPane seja modal – o que o força a estar na frente de uma janela especificada – então você precisa especificar uma janela (isto é, um JFrame – para aquele primeiro argumento).

Você pode definir o JOptionPane sempre no topo usando este código: –

  JFrame jf=new JFrame(); jf.setAlwaysOnTop(true); int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
 public static void showNotExist(JPanel panel, String action) { JOptionPane.showMessageDialog(rootPane, new JLabel(action.concat(" doesn't exist."), 2)); } 

Tente dar o rootpane como o primeiro valor na seção showMessageDialog

Se sua class estendeu o JFrame, simplesmente configure a propriedade de class setAlwaysOnTop (true); em qualquer lugar em construtores antes de JOptionPane.showMessageDialog (null, “OKay”);

Eu uso ele para copiar arquivos e checar, nem precisa de um JFrame mas de JOptionPane.

PS Se você não quer que o JFrame principal sempre apareça no topo, então você precisa criar um JFrame fictício ou redefinir a propriedade setAlwaysOnTop (false); depois do JOptionPane.