我有双显示器配置,如果找到,我想在特定的显示器中运行我的GUI。我试图通过屏幕设备的JFrame
对象创建我的GraphicConfiguration
窗口,但它不起作用,框架仍显示在主屏幕上。
如何设置必须显示框架的屏幕?
答案 0 :(得分:36)
public static void showOnScreen( int screen, JFrame frame )
{
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
if( screen > -1 && screen < gs.length )
{
gs[screen].setFullScreenWindow( frame );
}
else if( gs.length > 0 )
{
gs[0].setFullScreenWindow( frame );
}
else
{
throw new RuntimeException( "No Screens Found" );
}
}
答案 1 :(得分:31)
我修改了@ Joseph-gordon的答案,允许在没有强制全屏的情况下实现此目的:
public static void showOnScreen( int screen, JFrame frame ) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
if( screen > -1 && screen < gd.length ) {
frame.setLocation(gd[screen].getDefaultConfiguration().getBounds().x, frame.getY());
} else if( gd.length > 0 ) {
frame.setLocation(gd[0].getDefaultConfiguration().getBounds().x, frame.getY());
} else {
throw new RuntimeException( "No Screens Found" );
}
}
在这段代码中我假设getDefaultConfiguration()
永远不会返回null。如果不是这样,那么请有人纠正我。但是,此代码可以将JFrame
移动到所需的屏幕。
答案 2 :(得分:3)
阅读JFrame.setLocationRelativeTo的文档后,这是一个更清晰的解决方案 在屏幕2上显示
public void moveToScreen() {
setVisible(false);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();
int n = screens.length;
for (int i = 0; i < n; i++) {
if (screens[i].getIDstring().contentEquals(settings.getScreen())) {
JFrame dummy = new JFrame(screens[i].getDefaultConfiguration());
setLocationRelativeTo(dummy);
dummy.dispose();
}
}
setVisible(true);
}
此功能可用于在屏幕之间切换应用程序窗口
答案 3 :(得分:2)
请参阅GraphicsDevice API,那里有一个很好的例子。
答案 4 :(得分:1)
我的经验是将桌面扩展到多台显示器,而不是将显示器配置为单独的(X11)显示器。如果这不是您想要做的,这将不适用。
我的解决方案有点像黑客攻击:我打电话给Toolkit.getScreenSize()
,确定我是否处于多监视器状态(通过比较高度和宽度并假设宽度>两倍高度表示多个监视器),然后设置帧的初始X和Y位置。
答案 5 :(得分:1)
每个人都根据其他口味加入自己的口味,我添加我的,因为其他人锁定了你关于所选窗口的定位屏幕。
这是最好的。它允许您在其他屏幕上设置位置。
public void setLocation( int screen, double x, double y ) {
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] d = g.getScreenDevices();
if ( screen >= d.length ) {
screen = d.length - 1;
}
Rectangle bounds = d[screen].getDefaultConfiguration().getBounds();
// Is double?
if ( x == Math.floor(x) && !Double.isInfinite(x) ) {
x *= bounds.x; // Decimal -> percentage
}
if ( y == Math.floor(y) && !Double.isInfinite(y) ) {
y *= bounds.y; // Decimal -> percentage
}
x = bounds.x + x;
y = jframe.getY() + y;
if ( x > bounds.x) x = bounds.x;
if ( y > bounds.y) y = bounds.y;
// If double we do want to floor the value either way
jframe.setLocation((int)x, (int)y);
}
示例:强>
setLocation(2, 200, 200);
甚至允许您传递屏幕位置的百分比!
setLocation(2, 0.5, 0); // Place on right edge from the top down if combined with setSize(50%, 100%);
屏幕必须大于0,我相信这是一个艰难的要求!
要放在最后,只需使用Integer.MAX_VALUE调用。**
答案 6 :(得分:0)
对我来说也很好(假设左侧监视器的大小为1920x1200):
A)在左侧监视器上设置一些确切的位置:
newFrame.setBounds(200,100,400,200)
B)在正确的监视器上设置一些确切的位置:
newFrame.setBounds(2000,100,200,100)
C)在左侧监视器上设置最大化:
newFrame.setBounds(200,100,400,200)
newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)
D)在右侧监视器上设置最大化
newFrame.setBounds(2000,100,200,100)
newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)
答案 7 :(得分:0)
此处的许多解决方案适用于扩展显示。如果您使用单独的显示,只需将所需图形设备的图形配置对象传递给jframe或jdialog的构造函数。
答案 8 :(得分:0)
Vickys的答案包含正确的指针。这是新的JFrame(GraphicsConfiguration gc)。
你可以这样做:
GraphicsDevice otherScreen = getOtherScreen(this);
JFrame frameOnOtherScreen = new JFrame(otherScreen.getDefaultConfiguration());
private GraphicsDevice getOtherScreen(Component component) {
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
if (graphicsEnvironment.getScreenDevices().length == 1) {
// if there is only one screen, return that one
return graphicsEnvironment.getScreenDevices()[0];
}
GraphicsDevice theWrongOne = component.getGraphicsConfiguration().getDevice();
for (GraphicsDevice dev : graphicsEnvironment.getScreenDevices()) {
if (dev != theWrongOne) {
return dev;
}
}
return null;
}
答案 9 :(得分:0)
如果您想将其设置为左侧屏幕的中心:
int halfScreen = (int)(screenSize.width/2);
frame.setLocation((halfScreen - frame.getSize().width)/2, (screenSize.height - frame.getSize().height)/2);
如果您想将其设置为右侧屏幕的中心:
int halfScreen = (int)(screenSize.width/2);
frame.setLocation((halfScreen - frame.getSize().width)/2 + halfScreen, (screenSize.height - frame.getSize().height)/2);
答案 10 :(得分:0)
我修改了@ Joseph-gordon和@ryvantage的答案,以便在不强制全屏,固定屏幕配置位置的情况下实现此目的,并将其置于选择屏幕的中心位置:
public void showOnScreen(int screen, JFrame frame ) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
int width = 0, height = 0;
if( screen > -1 && screen < gd.length ) {
width = gd[screen].getDefaultConfiguration().getBounds().width;
height = gd[screen].getDefaultConfiguration().getBounds().height;
frame.setLocation(
((width / 2) - (frame.getSize().width / 2)) + gd[screen].getDefaultConfiguration().getBounds().x,
((height / 2) - (frame.getSize().height / 2)) + gd[screen].getDefaultConfiguration().getBounds().y
);
frame.setVisible(true);
} else {
throw new RuntimeException( "No Screens Found" );
}
}
答案 11 :(得分:0)
基于@ryvantage答案,我对其进行了改进,使其显示在屏幕中央:
private static void showOnScreen( int screen, Window frame ) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
GraphicsDevice graphicsDevice;
if( screen > -1 && screen < gd.length ) {
graphicsDevice = gd[screen];
} else if( gd.length > 0 ) {
graphicsDevice = gd[0];
} else {
throw new RuntimeException( "No Screens Found" );
}
Rectangle bounds = graphicsDevice.getDefaultConfiguration().getBounds();
int screenWidth = graphicsDevice.getDisplayMode().getWidth();
int screenHeight = graphicsDevice.getDisplayMode().getHeight();
frame.setLocation(bounds.x + (screenWidth - frame.getPreferredSize().width) / 2,
bounds.y + (screenHeight - frame.getPreferredSize().height) / 2);
frame.setVisible(true);
}