如何在同一台显示器上打开一个框架而不是另一个框架?

时间:2014-04-18 11:03:08

标签: java swing multiple-monitors

我有一个框架,可以通过按下按钮打开另一个框架。我想让第二帧出现在同一个屏幕上(在双显示器配置中)和第一帧。

怎么做?

UPDDATE

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

4 个答案:

答案 0 :(得分:1)

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

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

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

  1. 限制设计使用single frame;使用辅助窗口的对话框。

  2. 如果不存在偏好设置,请使用setLocationByPlatform()作为该框架的默认首选位置。

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

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

答案 1 :(得分:1)

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

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

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

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

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

如果您需要更多说明或示例,请与我们联系。

答案 2 :(得分:1)

我是这样做的:

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

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

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

答案 3 :(得分:0)

如果您想在与前任相同的显示器上打开新窗口(JPanel),您可以简单地通过:

EMP_CODE