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