Java 如何在swing中打开同一监视器上的一个帧和另一个帧?

Java 如何在swing中打开同一监视器上的一个帧和另一个帧?,java,swing,multiple-monitors,Java,Swing,Multiple Monitors,我有一个框架,它可以导致另一个框架打开,比如说,按下按钮。我想让第二帧显示在与第一帧相同的屏幕上(在双监视器配置中) 怎么做 UPDDATE 从父级JFrame传递getGraphicsConfiguration()没有帮助,尽管它包含正确的screen字段。根据建议,将用户对框架位置的选择存储在java.util.Preferences或javax.jnlp.BasicService中。默认设置为setLocationByPlatform(),并在启动时恢复位置。另见 附录:对不起,你在说什么

我有一个框架,它可以导致另一个框架打开,比如说,按下按钮。我想让第二帧显示在与第一帧相同的屏幕上(在双监视器配置中)

怎么做

UPDDATE


从父级
JFrame
传递
getGraphicsConfiguration()
没有帮助,尽管它包含正确的
screen
字段。

根据建议,将用户对框架位置的选择存储在
java.util.Preferences
javax.jnlp.BasicService
中。默认设置为
setLocationByPlatform()
,并在启动时恢复位置。另见

附录:对不起,你在说什么

让用户决定窗口的放置位置。概括地说

  • 将设计约束为使用;对辅助窗口使用对话框

  • 如果不存在首选项,请使用
    setLocationByPlatform()
    作为帧的默认首选位置

  • 如果用户移动了窗口,则将新位置记录为

  • 重新启动时,检索首选值,并使用它恢复帧的位置


  • 根据建议,将用户对框架位置的选择存储在
    java.util.Preferences
    javax.jnlp.BasicService
    中。默认设置为
    setLocationByPlatform()
    ,并在启动时恢复位置。另见

    附录:对不起,你在说什么

    让用户决定窗口的放置位置。概括地说

  • 将设计约束为使用;对辅助窗口使用对话框

  • 如果不存在首选项,请使用
    setLocationByPlatform()
    作为帧的默认首选位置

  • 如果用户移动了窗口,则将新位置记录为

  • 重新启动时,检索首选值,并使用它恢复帧的位置


  • 根据建议,将用户对框架位置的选择存储在
    java.util.Preferences
    javax.jnlp.BasicService
    中。默认设置为
    setLocationByPlatform()
    ,并在启动时恢复位置。另见

    附录:对不起,你在说什么

    让用户决定窗口的放置位置。概括地说

  • 将设计约束为使用;对辅助窗口使用对话框

  • 如果不存在首选项,请使用
    setLocationByPlatform()
    作为帧的默认首选位置

  • 如果用户移动了窗口,则将新位置记录为

  • 重新启动时,检索首选值,并使用它恢复帧的位置


  • 根据建议,将用户对框架位置的选择存储在
    java.util.Preferences
    javax.jnlp.BasicService
    中。默认设置为
    setLocationByPlatform()
    ,并在启动时恢复位置。另见

    附录:对不起,你在说什么

    让用户决定窗口的放置位置。概括地说

  • 将设计约束为使用;对辅助窗口使用对话框

  • 如果不存在首选项,请使用
    setLocationByPlatform()
    作为帧的默认首选位置

  • 如果用户移动了窗口,则将新位置记录为

  • 重新启动时,检索首选值,并使用它恢复帧的位置


  • 有很多方法可以做到这一点,但我会坚持我做的一个。以下是我使用MVC模型所做的:

    由于您有多个视图(框架),您可能需要使视图类属性非静态,并为内部框架(innerView)添加一个字段。这样,您可以创建一个视图并修改其组件,然后将其设置为另一个视图的内部视图。这也意味着向视图中添加组件最有可能在主程序类中完成,而不是在视图类本身中完成。这可能会有点忙,但仍然可行

    • 我在视图类中添加了一个
      List
      字段,可以在其中存储我要添加的组件。然后,我会用一个单独的方法将它们添加到面板中并对其进行更新
    • 由于我对所有视图使用相同的控制器,因此我还添加了一个
      列表
      ,以存储我创建的所有视图,然后设置我当前正在操作的视图

    • 接下来,我将构造两个具有固定大小的视图类(第一个和第二个)及其组件。我会将第一个的内部视图设置为第二个。请注意,第一个按钮有一次单击将显示第二个按钮

    • 最后,我为按钮制作了一个动作侦听器。单击按钮后,此侦听器将使第二个可见。它还将设置Second作为控制器类中的当前视图,以防您也想在那里创建按钮。按钮本身是在主程序类中创建的


    如果您需要更多的说明或示例,请告诉我。

    有很多方法可以做到这一点,但我会坚持使用我曾经使用过的方法。以下是我使用MVC模型所做的:

    由于您有多个视图(框架),您可能需要使视图类属性非静态,并为内部框架(innerView)添加一个字段。这样,您可以创建一个视图并修改其组件,然后将其设置为另一个视图的内部视图。这也意味着向视图中添加组件最有可能在主程序类中完成,而不是在视图类本身中完成。这可能会有点忙,但仍然可行

    • 我在视图类中添加了一个
      List
      字段,可以在其中存储我要添加的组件。然后,我会用一个单独的方法将它们添加到面板中并对其进行更新
    • 由于我对所有视图使用相同的控制器,因此我还添加了一个
      列表
      ,以存储我创建的所有视图,然后设置我当前正在操作的视图

    • 接下来,我将构造两个视图类(第一个和第二个),具有固定的大小和
      public static void showOnScreen(Window frame) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gd = ge.getScreenDevices();
      
        final GraphicsDevice frameDevice = frame.getParent().getGraphicsConfiguration().getDevice();
        for (GraphicsDevice graphicsDevice : gd) {
          if (frameDevice.equals(graphicsDevice) || frameDevice.getIDstring().equals(graphicsDevice.getIDstring())) {
            final Rectangle monitorBounds = graphicsDevice.getDefaultConfiguration().getBounds();
            final int x = monitorBounds.x + (monitorBounds.width - frame.getWidth()) /2;
            final int y = monitorBounds.y + (monitorBounds.height - frame.getHeight()) / 2;
            frame.setLocation(x, y);
          }
        }
      }
      
      newPanel.setLocationRelativeTo(parentPanel);