Java 如何设置JOptionPane的位置?

Java 如何设置JOptionPane的位置?,java,swing,location,joptionpane,Java,Swing,Location,Joptionpane,我有一个启动窗口,在程序加载时弹出。此启动窗口使用方法setAlwaysOnTop(true),这是我希望保留的 当程序的一个单独部分弹出一个JOptionPane通知用户需要更新软件时,问题就出现了。在Linux上,它出现在启动窗口的前面,但在Windows上,它出现在后面,用户几乎看不见,然后用户可能会坐上30分钟,然后才发现为什么它还没有加载 我想实现的修复方法是 强制JOptionPane在屏幕上的其他位置弹出 或 更改JOptionPane的显示位置,使其位于启动屏幕的顶部或底部

我有一个启动窗口,在程序加载时弹出。此启动窗口使用方法
setAlwaysOnTop(true)
,这是我希望保留的

当程序的一个单独部分弹出一个JOptionPane通知用户需要更新软件时,问题就出现了。在Linux上,它出现在启动窗口的前面,但在Windows上,它出现在后面,用户几乎看不见,然后用户可能会坐上30分钟,然后才发现为什么它还没有加载

我想实现的修复方法是

  • 强制JOptionPane在屏幕上的其他位置弹出
  • 更改JOptionPane的显示位置,使其位于启动屏幕的顶部或底部
我能看到的唯一一个函数就是
setLocationRelativeTo(Component myComponent)
方法。但这是没有好处的,因为没有什么比它更好的相对(也没有什么存在!)

这可能吗?如果是的话,我该怎么做呢

以下是我的SSCCE(基于他们回答中的SeniorJD代码):


这或多或少地模仿了我的用户所看到的行为。如何将JOptionPane移出初始屏幕?

您应该将
框架设置为
JOptionPane
的父级:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;


public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame("Frame");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JButton button = new JButton("Button");
                frame.add(button);

                frame.setAlwaysOnTop(true);
                frame.setSize(500, 500);
                frame.setLocation(500, 500);

                button.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JOptionPane optionPane = new JOptionPane("Option Pane");
                        optionPane.showMessageDialog(frame, "Message!"); // if you put null instead of frame, the option pane will be behind the frame
                    }
                });

                frame.setVisible(true);
            }
        });
    }
}
如果


由于某些原因,它在Windows上没有很好地显示出来。我会将它的大小设置为略大于启动屏幕,这样它会更明显,或者按照SeniorJD的建议执行。

@AndrewThompson:也没有
J2SE
之类的东西。这是几年来的
JavaSE
。@AndrewThompson你还好吗?辛苦的一天?意思是一样的。耐心点。@AndrewThompson我不在机器上编写代码,而且我很少使用那个类。不管怎样,我已经修复了它。有趣的是,我将框架设置为“父级”,而不是空的。如果我包括一个
frame.setAlwaysOnTop(true)对于您的示例,消息会弹出到旁边。我去看看是什么让我的处境不同。谢谢我编辑了我的问题,向你们展示我的SSCCE,我希望这能帮助解释我的情况@Pureferret确实需要两个不相关的
JFrames
?不,我不需要,当我开始查看代码时,我意识到了这一点。我还在想,如果我想保留两个,是否有什么解决方案?您应该将
JFrame
设置为父级,此时它将位于顶部。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;


public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame("Frame");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JButton button = new JButton("Button");
                frame.add(button);

                frame.setAlwaysOnTop(true);
                frame.setSize(500, 500);
                frame.setLocation(500, 500);

                button.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JOptionPane optionPane = new JOptionPane("Option Pane");
                        optionPane.showMessageDialog(frame, "Message!"); // if you put null instead of frame, the option pane will be behind the frame
                    }
                });

                frame.setVisible(true);
            }
        });
    }
}
setLocationRelativeTo(null);