Java 如何确保JOptionPane在特定监视器上打开?

Java 如何确保JOptionPane在特定监视器上打开?,java,swing,joptionpane,Java,Swing,Joptionpane,使用启动许多后台进程的Java应用程序。 如果出现问题,JOptionPane会弹出一些一般信息。 工作站有多个监视器,可能会出现JOptionPane 他们中的任何一个。 没有关联的窗口可用作JOptionPane的“父窗口”。 有没有办法指定JOptionPane应该出现在哪个监视器上?如果直接使用JOptionPane可以通过实例化对话框来指定对话框将出现的位置。例如: JOptionPane pane = new JOptionPane("Hi!"); JDialog dialo

使用启动许多后台进程的Java应用程序。
如果出现问题,
JOptionPane
会弹出一些一般信息。
工作站有多个监视器,可能会出现
JOptionPane
他们中的任何一个。
没有关联的窗口可用作
JOptionPane
的“父窗口”。

有没有办法指定
JOptionPane
应该出现在哪个监视器上?

如果直接使用
JOptionPane
可以通过实例化对话框来指定对话框将出现的位置。例如:

JOptionPane pane = new JOptionPane("Hi!");
JDialog dialog = pane.createDialog("Look at me");
dialog.setVisible(true);
在本例中,在调用
dialog.setVisible()
之前,可以定位对话框,例如:

dialog.setBounds(100, 100, 100, 100);
要在非默认的显示器上显示对话框,必须获得所需显示器的边界(),并且可以将对话框定位在该区域内

下面是如何获得显示列表(及其边界)。代码取自的Javadoc):

Rectangle virtualBounds=new Rectangle();
GraphicsEnvironment ge=GraphicsEnvironment。
getLocalGraphicsEnvironment();
图形设备[]gs=
ge.getScreenDevices();
对于(int j=0;j
如果您有4个大小相同的监视器,则看起来仍然是一个bug(父屏幕不在第二个屏幕上,没有父屏幕),这是不是会在数组中产生具有相同边界的4个元素,或者所有4个窗口都计算为一个具有4个段的大窗口,每个段都是整体大小的子集?@user3601445显示的边界不是基于(0;0)的,它们是绝对的,不重叠。例如,你的默认显示应该有(x=0,y=0),如果你在左边有第二个显示,它应该有一个负的x,比如x=-1024。但是你为什么不试试呢?运行代码并打印
virtualBounds
矩形。
Rectangle virtualBounds = new Rectangle();
GraphicsEnvironment ge = GraphicsEnvironment.
        getLocalGraphicsEnvironment();
GraphicsDevice[] gs =
        ge.getScreenDevices();
for (int j = 0; j < gs.length; j++) {
    GraphicsDevice gd = gs[j];
    GraphicsConfiguration[] gc =
        gd.getConfigurations();
    for (int i=0; i < gc.length; i++) {
        virtualBounds =
            virtualBounds.union(gc[i].getBounds());
    }
}