我创建了一个DialogUtil,它显示了不同情况下的JOptionPan数量。 有时在我的动作类中使用null参数调用此方法,如下所示。
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));
}
答案 0 :(得分:14)
你尝试过这样的事吗?
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上运行该代码。
答案 1 :(得分:7)
您可以使用以下代码始终在顶部设置JOptionPane: -
JFrame jf=new JFrame();
jf.setAlwaysOnTop(true);
int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
答案 2 :(得分:5)
有两个可能的问题
从EDT调出JOptionPane,然后只有工具栏(来自Native OS的标题在屏幕上可见,RootPane不可见)在屏幕上可见
在那里你可以测试JOptionPanes的功能,其中JOptionPane.showInternalMessageDialog()在所有情况下都会出现麻烦,即有另一个带有setModal的JDialog(true),真正的原因我不知道,同样应该是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://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");
}
});
}
}
答案 3 :(得分:4)
我不知道WebOptionPane
或WebPanel
是什么,但如果它们基于JOptionPane
,则问题在于您传递的是null
showXXX()
方法的第一个参数。如果你希望JOptionPane
是模态的 - 它强制它在指定的窗口前面 - 那么你需要为第一个参数指定一个窗口(即JFrame
- 。
答案 4 :(得分:1)
LocalDownloadJSON
尝试将rootpane作为showMessageDialog部分中的第一个值
答案 5 :(得分:1)
如果你的课程扩展了JFrame,那么只需设置 class属性setAlwaysOnTop(true);在JOptionPane.showMessageDialog之前的构造函数中的任何位置(null," OKay");
我用它来复制文件和检查,甚至不需要JFrame而是JOptionPane。
P.S。如果您不希望主JFrame始终显示在顶部,那么您需要创建虚拟JFrame或重置属性setAlwaysOnTop(false);在JOptionPane之后。