2015-06-24 2 views
2

Не обращайте внимания на использование оконных вставок, но уделяйте больше внимания использованию ScreenInsets, который сохраняется локально как вставки Insets; Я печатаю insets.bottom, и для каждого монитора отображается высота панели задач, даже если панель задач находится только на первом мониторе.Получение каждой вкладки монитора в Java

Мониторные вставки на моем втором мониторе должны быть равны нулю, но все же он действует так, как если бы панель задач находилась на обоих мониторах. Установка окна в полный размер на мониторе, которое в настоящее время находится на рабочем столе, за исключением того, что оно оставляет место для панели задач независимо от того, какой монитор использует ее.

Из моего понимания Toolkit.getScreenInsets (GraphicsConfiguration) это должно верните правильные вставки для конкретной конфигурации GraphicsConfiguration, но я передаю в GraphicsConfiguration GraphicsDevice и получаю те же результаты.

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

Re: "..., но он действует так, как будто панель задач находится на обоих мониторах".

я нашел следующее:

Ссылаясь на Windows-> Панель управления-> Внешний вид и Personalization-> Экран-> Разрешение экрана:

Когда гс [0] (= на дисплее отображается с «1» внутри круга в окне панели управления выше) имеет панель инструментов, сообщенные вставки верны.

I.e., они, как сообщается, равны 0 для экрана без панели инструментов и = 49 для экрана с панелью инструментов.

При любом другом гсе [х] имеют панель инструменты, сообщаемые вставки неверна :-(. Т.е., они, как сообщается, = 49 для всех экранов.

В моем приложении, я хочу «JDialog dialog0 «чтобы всегда отображалось 500 справа от нижнего левого угла моего« большого »дисплея, а« JFrame frameBalloonHerderGui »всегда отображался в верхнем левом углу моего« маленького »дисплея.

Я хочу, чтобы JDialog иметь фиксированный размер в нижнем левом углу моего «большого» дисплея, а JFrame должен в значительной степени заполнить «маленький» дисплей, в котором он находится.

Я сделал giv e graphicsConfiguration для отображения мне хотелось, чтобы каждый JDialog/JFrame появился в своих конструкторах. Увы, этого недостаточно, чтобы вставки были правильными.

Чтобы выполнить позиционирование выше, я написал функцию, которую я называю мой 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 & .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;  
}