выравнивание Jframe по разным местам

я знаю, что Java, работающая на JVM, делает ее независимой от платформы. Недавно я учился разрабатывать настольные приложения, поэтому у меня вопрос: как сделать так, чтобы мой экран приложения выскакивал точно вверху справа/слева, внизу справа/слева или по центру? Например, для правого верхнего угла мы можем просто использовать :
frame.setLocation(0,0)
или для центра, один хороший, независимый от платформы способ, который я нашел здесь, был:
frame.setLocationRelativeTo(null)

а как насчет остальных 3 ребер? я видел несколько больших кусков кода, использующих другие классы (классы измерений/точек) или пакеты, но либо они были слишком сложными, либо ориентированы на конкретное направление (например, один ответ здесь, который я видел, легко сделает мое приложение всплывающим внизу; но если мой Учитель сказал, что хочет видеть всплывающее окно приложения сверху, мне нужно перекодировать все решение). Я также пытался использовать getmaximumsize().height/width, но безрезультатно.

я бы хотел, чтобы кто-нибудь помог мне с кодом, обрабатывающим все возможные края и центральное расположение (даже если он использует другие классы/пакеты; если он удовлетворяет всем вышеперечисленным случаям, ваш ответ приветствуется). и еще один мини-вопрос: есть ли какие-либо переменные MAXWINDOW в java, например, экран моего окна составляет 15,6 дюйма, а панель инструментов 0,5 дюйма ниже делает идеальное дно для моего jframe 250 * 100 пикселей равным 0,15,5 дюйма, переменная, сообщающая, что perticular идеальное значение? и изменение его значения в соответствии с расположением моей панели инструментов или операционных систем, имеющих меньшие/большие размеры и расположение панелей инструментов??
это просто пришло на ум, потому что мне показалось, что такая переменная может быть весьма удобной и добавляет больше к платформенно-независимая природа java.

EDIT...
спасибо @bjorn и @madprogrammer за их слишком хорошие ответы. Я никогда не думал, что проблема «получения размера окна без панели задач для местоположения» потребует такого большого кода, учитывая пункт, не зависящий от платформы. Я чувствую, что ответ Бьорна в настоящее время меня полностью удовлетворяет. но ответ Мэда более точен (или точен, мой английский) к проблемам, которые я цитировал.


person ansh sachdeva    schedule 10.07.2017    source источник
comment
Я даже могу использовать этот фрагмент для получения окна максимального размера - я бы посмотрел на JFrame#setExtendedState и развернул окно независимым от платформы способом, который не будет размещать части окна под панелью задач/док-станцией   -  person MadProgrammer    schedule 11.07.2017


Ответы (2)


Toolkit.getDefaultToolkit().getScreenSize(); возвращает полный размер экрана по умолчанию, он не принимает во внимание другие элементы экрана, такие как док-станция или панель задач, которые не всегда находятся внизу экрана и не всегда тот же размер

Лучшим решением может быть использование Toolkit.getDefaultToolkit().getScreenInsets и GraphicsConfiguration

public static Rectangle getScreenViewableBounds(Window window) {
    return getScreenViewableBounds((Component) window);
}

public static Rectangle getScreenViewableBounds(Component comp) {
    return getScreenViewableBounds(getGraphicsDevice(comp));
}

public static Rectangle getScreenViewableBounds(GraphicsDevice gd) {
    Rectangle bounds = new Rectangle(0, 0, 0, 0);
    if (gd == null) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gd = ge.getDefaultScreenDevice();
    }

    if (gd != null) {
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        bounds = gc.getBounds();

        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
        bounds.x += insets.left;
        bounds.y += insets.top;
        bounds.width -= (insets.left + insets.right);
        bounds.height -= (insets.top + insets.bottom);
    }

    return bounds;
}

Это вернет «безопасный видимый» диапазон определенного экрана. Если вы передадите его null, он будет использовать экран «по умолчанию».

// Safe viewable area for default screen
Rectangle bounds = getScreenViewableBounds(null);
int x = bounds.x + ((bounds.width - getWidth());
int y = bounds.y + ((bounds.width - getHeight());

setLocation(x, y);

Что поместит окно в нижнее/правое положение окна, НО поместит его выровненным по панели задач (поскольку у большинства людей оно выровнено по нижней части)

Для странных людей вроде меня, которые размещают панель задач в верхней части экрана.

// Safe viewable area for default screen
Rectangle bounds = getScreenViewableBounds(null);
int x = bounds.x;
int y = bounds.y;

setLocation(x, y);

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

И да, я видел слишком много разработчиков, использующих setLocation(0, 0) и размещающих окно под панелью задач/строкой меню, их имена становятся «грязными».

person MadProgrammer    schedule 11.07.2017
comment
спасибо за такой подробный ответ! вы закодировали решение именно той проблемы, о которой я думал. хотя теперь я вижу ответ, я думаю, что проблема, которую я цитировал, несколько более неприятная xD. обязательно вернусь к этому решению, когда у меня будет достаточно знаний, чтобы понять его в целом (я немного нуб, знаете ли: p) - person ansh sachdeva; 13.07.2017

Вы можете получить размер экрана с помощью следующего кода:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();

Затем в кадре вы можете установить соответствующую позицию, вычитая ширину JFrame из ширины экрана. Соответственно, для высоты такая же процедура.

person Björn Zurmaar    schedule 10.07.2017
comment
спасибо !, я даже могу использовать этот фрагмент для получения окна максимального размера :) - person ansh sachdeva; 11.07.2017
comment
При этом не учитываются такие элементы, как док-станция или панель задач, и возникает риск размещения окна под ними. - person MadProgrammer; 11.07.2017
comment
@anshsachdeva: Это не очень хорошая идея. Вам лучше позвонить JFrame.setExtendedState (целое число) - person Björn Zurmaar; 11.07.2017
comment
@MadProgrammer Ты прав. Я думал, что всплывающее окно точно вверху справа/слева или внизу справа/слева относится к краям экрана, а не к доступному рабочему столу. - person Björn Zurmaar; 11.07.2017
comment
@BjörnZurmaar Количество окон, которые открываются под моей панелью задач, меня бесит: P - person MadProgrammer; 11.07.2017
comment
@Björn, @mad только что проверил ссылку оракула setExtened(). еще раз спасибо. :). - person ansh sachdeva; 13.07.2017