【问题标题】:How to open one frame on the same monitor as another in swing?如何在同一台显示器上打开一个框架作为另一个在摇摆中?
【发布时间】:2014-06-02 21:13:36
【问题描述】:

我有一个框架,这可能会导致另一个框架打开,例如,通过按下按钮。我想让第二帧出现在与第一帧相同的屏幕上(在双显示器配置中)。

怎么做?

更新

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

【问题讨论】:

  • 你看过 GraphicsContext 能告诉你什么吗?
  • 您是在问如何在同一个应用程序中加载第二个 JFrame,或者如何在特定的监视器中放置一个 JFrame?
  • 我添加了另一个解决方案(?)

标签: java swing multiple-monitors


【解决方案1】:

按照建议的here,将用户对框架位置的选择存储在java.util.Preferencesjavax.jnlp.BasicService 中。默认为setLocationByPlatform(),并在启动时恢复位置。另见The Use of Multiple JFrames, Good/Bad Practice?

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

用户决定把窗口放在哪里。概括地说,

  1. 约束设计使用single frame;对子窗口使用对话框。

  2. 如果不存在首选项,则使用 setLocationByPlatform() 作为框架的默认首选位置。

  3. 如果用户移动窗口,将新位置记录为preference

  4. 重新启动时,检索首选值,并使用它来恢复框架的位置。

【讨论】:

  • 对不起,你在说什么?
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我是这样做的:

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

    代码搜索给定框架的父级使用的设备。然后它将框架集中在该特定监视器上。

    我只在双显示器配置中测试了这段代码。

    【讨论】:

      【解决方案4】:

      如果您想在与前任相同的监视器上打开新窗口(JPanel),您可以通过以下方式简单地完成:

      newPanel.setLocationRelativeTo(parentPanel);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        相关资源
        最近更新 更多