如何在所有窗口的顶部显示 JOptionPane
Posted
技术标签:
【中文标题】如何在所有窗口的顶部显示 JOptionPane【英文标题】:how to show JOptionPane on the top of all windows 【发布时间】:2012-06-08 12:10:11 【问题描述】:我创建了一个 DialogUtil,它显示不同情况下 JOptionPan 的数量。 有时在我的动作类中使用如下的空参数调用此方法。
DialogUtil.showNotExist(null,xml.getName().concat(" is null or"));
在这种情况下,JOptionPane 不会出现在窗口顶部。
如何向 JOptionPane 添加内容以始终显示在顶部?
public static void showNotExist(JPanel panel, String action)
JOptionPane.showMessageDialog(panel, new JLabel(action.concat(" doesn't exist."), 2));
【问题讨论】:
只需将 parent 作为参数传递,而不是JPanel
,让它成为主要容器,即 JFrame
,那么您真的不必为这些事情烦恼:-)跨度>
“有时在我的操作类中使用如下的空参数调用此方法。” 为什么null
?
因为我在没有引用 GUI 或框架的类的主体中调用此方法。
【参考方案1】:
您可以使用以下代码将 JOptionPane 设置在最前面:-
JFrame jf=new JFrame();
jf.setAlwaysOnTop(true);
int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
【讨论】:
【参考方案2】:如果你的类扩展了 JFrame,那么只需简单地设置 类属性 setAlwaysOnTop(true);在 JOptionPane.showMessageDialog(null,"OKay"); 之前的构造函数中的任何位置;
我用它来复制文件和检查,甚至不需要 JFrame 而需要 JOptionPane。
附:如果您不希望主 JFrame 始终显示在顶部,则需要创建虚拟 JFrame 或重置属性 setAlwaysOnTop(false);在 JOptionPane 之后。
【讨论】:
【参考方案3】:public static void showNotExist(JPanel panel, String action)
JOptionPane.showMessageDialog(rootPane, new JLabel(action.concat(" doesn't exist."), 2));
尝试将根窗格作为 showMessageDialog 部分中的第一个值
【讨论】:
【参考方案4】:你尝试过这样的事情吗?
JOptionPane optionPane = new JOptionPane();
JDialog dialog = optionPane.createDialog("Title");
dialog.setAlwaysOnTop(alwaysOnTop);
dialog.setVisible(true);
不能保证操作系统会允许您的对话框始终位于顶部,但它通常会起作用。
如果您有一个现有的窗口或对话框,并且您想将其置于顶部,但又不想永久设置 alwaysOnTop,那么这应该可以同时保留 alwaysOnTop 的旧值:
boolean supported = window.isAlwaysOnTopSupported();
boolean old_alwaysOnTop = window.isAlwaysOnTop();
if (supported)
window.setAlwaysOnTop(true);
window.toFront();
window.requestFocus();
if (supported)
window.setAlwaysOnTop(old_alwaysOnTop);
仅在 SwingThread 上运行该代码。
【讨论】:
【参考方案5】:有两个可能的问题
从 EDT 调用 JOptionPane,然后屏幕上只显示工具栏(来自 Native OS 的标题,不显示 RootPane)
在那里你可以测试 JOptionPanes 功能,其中 JOptionPane.showInternalMessageDialog() 在所有情况下都会造成麻烦,即存在另一个带有 setModal(true) 的 JDialog,真正的原因我不知道,ModalityTypes 应该也是如此
不能同时在屏幕上显示两个 JOptionPanes
代码
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://***.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://***.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");
);
【讨论】:
【参考方案6】:我不知道WebOptionPane
或WebPanel
是什么,但如果它们基于JOptionPane
,那么问题是您将null
的第一个参数传递给showXXX()
方法。如果您希望JOptionPane
是模态的——强制它位于指定窗口的前面——那么您需要为第一个参数指定一个窗口(即JFrame
)。
【讨论】:
你是对的,我知道这一点,但我想排在首位,第一个参数是什么,没有指定窗口? 你很有趣。谢谢你的独角兽,我的意思是我想让 JOPtionPan 放在窗户的顶部。 @itro,我的意思是你可以想要一些不现实的东西。您必须指定一个框架;如果它必须是最前面的框架,那么你必须弄清楚那是哪一个。有一个静态方法Frame.getFrames()
列出了所有现有的Frame
对象,还有一个方法Window.getFocusOwner()
可以用来确定Frame
是否是最前面的。你的实用方法需要找到正确的Frame
并使用它。以上是关于如何在所有窗口的顶部显示 JOptionPane的主要内容,如果未能解决你的问题,请参考以下文章
将表单窗口带到应用程序的顶部而不是所有应用程序的顶部[重复]
在.NET MVC中按下提交按钮后如何在屏幕顶部显示成功弹出窗口?