不要介意使用Window Insets,但要更加注意ScreenInsets的使用,ScreenInsets在本地保存为Insets insets;我打印insets.bottom,并为每个监视器显示任务栏高度,即使任务栏仅位于第一个监视器上。
我的第二台显示器上的监视器插件应该都为零,但它的作用就像任务栏位于两台显示器上一样。在监视器中将窗口设置为完整大小窗口当前位于工作区域,除了它为任务栏留出空间,无论哪个监视器使用它。
根据我对Toolkit.getScreenInsets(GraphicsConfiguration)的理解,它应该为您传入的特定GraphicsConfiguration返回正确的insets,但是我将传入每个GraphicsDevice的GraphicsConfiguration并返回相同的结果。
JFrame window;
public void setSizeToFullScreen()
{
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screenDevices=ge.getScreenDevices();
Point p=window.getLocationOnScreen();
for(int i=0;i<screenDevices.length;i++)
{
Rectangle2D b=screenDevices[i].getDefaultConfiguration().getBounds();
if(SMath.getMath().doesRectangleContainPoint(b.getX(), b.getY(), b.getWidth(), b.getHeight(), p.getX(),p.getY()))
{
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(screenDevices[i].getDefaultConfiguration());
System.out.println("Monitor: "+i+": task bar height: "+insets.bottom);
this.setSize(b.getWidth()+1 -(insets.right+insets.left)-(this.window.getInsets().left+this.window.getInsets().right), b.getHeight()+1-(insets.top+insets.bottom)-(this.window.getInsets().top+this.window.getInsets().bottom));
this.setLocation(b.getX()+insets.left+window.getInsets().left, b.getY()+insets.top+window.getInsets().top);
return;
}
}
}
我的问题是,在Java中,我们如何确定哪个监视器实际上有任务栏,或者更好的问题,我们如何为Java中的每个监视器获取正确的监视器插入。
答案 0 :(得分:0)
Re:&#34; ...,但它的作用就像任务栏位于两个显示器上一样#34;。
我发现了以下内容:
参考Windows-&gt;控制面板 - &gt;外观和个性化 - &gt; 显示 - &gt;屏幕分辨率:
当gs [0](=使用&#34; 1&#34显示的显示;在上面的控制面板窗口中的圆圈内显示)具有工具栏时,报告的插图是正确的。
即,对于无工具栏屏幕,它们被报告为= 0,对于具有工具栏的屏幕,它们被报告为= 49.
当任何其他gs [x]具有工具栏时,报告的Insets是错误的:-(。即,对于所有屏幕,它们被报告为= 49。
在我的应用程序中,我想要&#34; JDialog dialog0&#34;总是出现在我&#34;大&#34;左下角的右边500显示和&#34; JFrame frameBalloonHerderGui&#34;总是出现在我的&#34;小&#34;的左上角。显示。
我希望JDialog在我的&#34;大&#34;的左下角有一个固定的大小。显示,JFrame几乎应该填充&#34;小&#34;显示它。
我确实为显示器提供了graphicsConfiguration,我想让每个JDialog / JFrame出现在它们的构造函数中。唉,这还不足以让Insets正确。
为了完成上面的定位,我写了一个函数,我调用我的JDialog和JFrame如下:
// I'll omit the creation of the grapicsConfiguration for now.
JDialog dialog0 = new JDialog( gc);
ScreenAndTaskBarHeights h = getThisComponentsScreensTaskBarHeight( dialog0);
final int myWidth = 1170;
final int myHeight = 800;
final int myScreenXInset = 500;
final int myScreenYInset = 10;
dialog0.setBounds(
h.screenOriginX + myScreenXInset,
h.screenOriginY + h.screenHeight - myHeight - h.taskBarHeight - myScreenYInset,
myWidth, myHeight);
dialog0.setVisible( true);
// I'll omit the creation of the grapicsConfiguration for now.
JFrame frameBalloonHerderGui = new JFrame( gc);
ScreenAndTaskBarHeights h =
getThisComponentsScreensTaskBarHeight( frameBalloonHerderGui);
final int myWidth = 1695;
final int myScreenInset = 10;
frameBalloonHerderGui.setBounds(
h.screenOriginX + myScreenInset,
h.screenOriginY + myScreenInset,
myWidth, h.screenHeight - (myScreenInset * 2) - h.taskBarHeight);
frameBalloonHerderGui.setVisible( true);
我找到的解决方法是screenSize.x&amp; .y =(0,0)用于具有TaskBar的显示器,以及其他显示器的一些大的正数或负数。
以下功能成功实现了此解决方法。我也做了一个简单的类,所以我可以将多个值传递给调用者,如上所示。
// Add additional data members here to your liking.
static class ScreenAndTaskBarHeights
{
int screenOriginX = -1;
int screenOriginY = -1;
int screenHeight = -1;
int taskBarHeight = -1;
ScreenAndTaskBarHeights()
{
}
void setValues(
int newScreenOriginX, int newScreenOriginY,
int newScreenHeight, int newTaskBarHeight)
{
screenOriginX = newScreenOriginX;
screenOriginY = newScreenOriginY;
screenHeight = newScreenHeight;
taskBarHeight = newTaskBarHeight;
}
}
static ScreenAndTaskBarHeights
getThisComponentsScreensTaskBarHeight( Component c)
{
ScreenAndTaskBarHeights screenAndTaskBarHeights =
new ScreenAndTaskBarHeights();
GraphicsConfiguration gc = c.getGraphicsConfiguration();
Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets( gc);
// This should be the TaskBar height specific to the gc that we
// passed in, but it's not :-(.
//
// int taskBarHeight = scnMax.bottom;
//
// However, this seems to be a successful workaround:
//
Rectangle screenSize = gc.getBounds();
boolean thisScreenHasTheToolbar =
(screenSize.x == 0 && screenSize.y == 0);
// Change scnMax.bottom to catch wherever you're worried that the
// TaskBar may be lurking.
//
screenAndTaskBarHeights.setValues(
screenSize.x, screenSize.y, screenSize.height,
(thisScreenHasTheToolbar) ? scnMax.bottom : 0);
return screenAndTaskBarHeights;
}