gpt4 book ai didi

java - 如何设置 JOptionPane 的位置?

转载 作者:行者123 更新时间:2023-11-30 04:20:03 24 4
gpt4 key购买 nike

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

当程序的单独部分弹出 JOptionPane 以通知用户需要更新软件时,就会出现问题。在 Linux 上,它出现在 Splash 窗口的前面,但在 Windows 上,它出现在后面,用户几乎看不到,然后用户可能会坐 30 分钟 - 一个小时,然后才找出它尚未加载的原因。

我想要实现的修复是:

  • 强制 JOptionPane 在屏幕上的其他位置弹出
  • 更改 JOptionPane 的显示位置,使其位于启动屏幕的顶部或底部。

我能看到的唯一可以执行此操作的函数是 setLocationRelativeTo(Component myComponent) 方法。但这是不好的,因为没有什么比它更好的相关性了(并且没有任何存在!)。

这种事情可能吗?如果是这样我该怎么做?

这是我的 SSCCE(基于 SeniorJD 在他们的答案中的代码):

public class Main {
public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final Splash splash =new Splash();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
final Frame frame = new Frame("Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
splash.dispose();
}
});
}
}

@SuppressWarnings("serial")
public class Frame extends JFrame implements ActionListener{
Frame(String title){
super(title);
JButton button = new JButton("Button");
add(button);

setAlwaysOnTop(true);
setSize(500, 500);
setLocationRelativeTo(getParent());
setAlwaysOnTop(true);
button.addActionListener(this);
actionPerformed(null);
}

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane optionPane = new JOptionPane("Option Pane");
optionPane.showMessageDialog(this, "Message: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tristique gravida congue.");
}
}
@SuppressWarnings("serial")
public class Splash extends JFrame {
public Splash() throws HeadlessException {
setAlwaysOnTop(true);
setUndecorated(true);
setVisible(true);
setSize(600, 450);
setLocationRelativeTo(getParent());
}
}

这更多地模拟了我的用户所看到的行为。如何将 JOptionPane 移出启动屏幕?

最佳答案

您应该将 frame 设置为 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);
}
});
}
}

关于java - 如何设置 JOptionPane 的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com