在Java中使用每个监视器插入

时间:2015-06-24 15:11:23

标签: java monitor taskbar insets

不要介意使用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中的每个监视器获取正确的监视器插入。

1 个答案:

答案 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;     
}