Java: Учет панелей задач / меню / и т.д. при размещении окна на рабочем столе? - PullRequest
2 голосов
/ 08 февраля 2009

Когда моя программа запускается, главное окно размещается там, где оно было, когда оно в последний раз закрывалось. Я хочу изменить это поведение, поэтому, если окно находится за пределами экрана (или частично за пределами экрана), оно полностью переходит на экран.

У меня это отлично работает. Вот код:

    int x = gameConfig.windowX;
    int y = gameConfig.windowY;
    int width = gameConfig.windowWidth;
    int height = gameConfig.windowHeight;

    if( x < 0 ) x = 0;
    if( y < 0 ) y = 0;

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    if( x + width > screenSize.width ) x = screenSize.width - width;
    if( y + height > screenSize.height ) y = screenSize.height - height;

    if( width > screenSize.width ) width = screenSize.width;
    if( height > screenSize.height ) height = screenSize.height;

    this.setLocation(x, y);
    this.setSize(width, height );

    if( gameConfig.screenMaximized ) {
        this.setExtendedState(getExtendedState() | MAXIMIZED_BOTH );
    }



Это работает как ожидалось, но с одним большим исключением; это не учитывает панели задач. В окнах, если окно выходит за нижнюю часть экрана, этот код исправит его, но все равно оставляет часть окна заблокированной панелью задач.

Я не уверен, как это сделать. Можно ли как-нибудь спросить java о каких-либо панелях задач в системе, и какова их ширина / высота?


Спасибо, что отлично сработало.

Знаете ли вы, как получить его, чтобы Java отображала общий размер экрана обоих моих мониторов при вызове getScreenSize ()? Прямо сейчас он возвращает 1600x1200, тогда как на самом деле это 3200x1200, на двух мониторах.

Java API предлагает, чтобы GraphicsConfiguration.getBounds () справилась бы с задачей, но все равно возвращает прямоугольник {0, 0, 1600, 1200}.

Ответы [ 4 ]

4 голосов
/ 08 февраля 2009

Использовать getScreenInsets (Java 4 +):

static public Insets getScreenInsets(Window wnd) {
    Insets                              si;

    try {
        if(wnd==null) { si=Toolkit.getDefaultToolkit().getScreenInsets(new Frame().getGraphicsConfiguration()); }
        else          { si=wnd.getToolkit()           .getScreenInsets(wnd.getGraphicsConfiguration());         }
        } catch(NoSuchMethodError thr) { si=new Insets(0,0,0,0); }
    return si;
    }

(Этот метод допускает использование нескольких экранов и старых JVM, которые не поддерживают API).

И всегда помните, что панель задач может находиться на любом краю экрана, а не только на его нижней части.

2 голосов
/ 09 января 2012

Приведенный ниже код сработал для меня, даже протестирован путем перемещения панели инструментов вправо Но не пробовал с несколькими экранами.

public class Scene extends JFrame {
private static final long serialVersionUID = 42L;

public Scene() {
    Canvas canvas = new Canvas();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setContentPane(canvas);
    this.pack();
    this.putFrameInRightCorner();
    this.setVisible(true);
}

protected void putFrameInRightCorner(){
    Rectangle winSize = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    Dimension frameSize = this.getSize();
    int taskBarWidth = screenSize.width - winSize.width;
    int taskBarHeight = screenSize.height - winSize.height;
    this.setLocation((screenSize.width - frameSize.width - taskBarWidth), 
                      (screenSize.height - frameSize.height - taskBarHeight));
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Scene();
        }
    });
}
}
1 голос
/ 23 сентября 2012

Следуя сообщениям Павана Кумара Кундагола Сундары, ответили 9 января в 14:03, я получил этот красивый и отлично работающий код:

import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;

Rectangle janelSOdisponivel = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
int janelaSOaltura = janelSOdisponivel.height;
int janelaSOlargura = janelSOdisponivel.width;

А затем с помощью двух переменных (janelaSOaltura, janelaSOlargura), как мне было нужно.

0 голосов
/ 09 февраля 2009

Что касается нескольких экранов, я на самом деле этого не делал, но я считаю, что каждый экран имеет свою собственную графическую конфигурацию. Насколько я понимаю, вы можете перечислить конфигурации, чтобы найти ту, которая вам нужна - тогда вы используете те же API, которые мы уже обсуждали.

Похоже, что документ для GraphicConfiguration содержит детали, которые вам нужны:

GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]    gs=ge.getScreenDevices();
for(int j = 0; j<gs.length; j++) { 
    GraphicsDevice gd=gs[j];
    GraphicsConfiguration[] gc=gd.getConfigurations();
    for (int i=0; i<gc.length; i++) {
        ...
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...