В Microsoft Windows я могу заставить окно приложения занимать половину экрана, используя ярлыки:
Эти ярлыки вызывают «разделение экрана», как показано на этом снимке экрана:
Я хотел бы программно изменить размер и положение JFrame таким же образом. Однако я не знаю, как добиться желаемого результата.
Я думал, что решение было:
Вот MCVE:
JFrame testFrame = new JFrame();
Rectangle windowBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
testFrame.setSize(windowBounds.width / 2, windowBounds.height);
testFrame.setLocation((int) windowBounds.getMinX(), (int) windowBounds.getMinY());
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testFrame.setVisible(true);
Это почти работает, но окно имеет небольшие поля внизу и слева:
Есть ли на компьютере под управлением Windows способ программно разделить экран с помощью Java или, возможно, JNI?
Почему вы хотите сделать это сами? Если пользователи вашей программы захотят сделать это с помощью вашей программы, они могут сделать это без специальной поддержки со стороны вашей программы - Windows делает это с программами.
Вы говорите об операции, которая контролируется ОС, почему вы чувствуете необходимость воспроизводить ее в своем коде?
Вероятно, вам нужен testFrame.setExtendedWindowState(Frame.MAXIMIZED_VERT).
@ThomasKläger Функциональность была запрошена для приложения в моей компании. Лично я думаю, что это решает проблему, которой не существует, но компания хочет, чтобы кнопка разделяла экран (поскольку сочетания клавиш предположительно слишком сложны для изучения «нетехнически подкованными» людьми).
@MadProgrammer см. комментарий выше ^
@CardinalSystem, «поскольку сочетания клавиш, как утверждается, слишком сложны для изучения «нетехнически подкованными» людьми» - наступает момент, когда, если некоторые из них «тупые», вы перестаете их обслуживать. Сочетания клавиш универсальны для Windows (например, начиная с Windows 7?!?), поэтому я уверен, что они будут очень рады узнать о них, поскольку это значительно облегчит их повседневную жизнь.
Возможно, вам следует обслуживать «нетехнически подкованных» пользователей, предлагая провести учебные курсы по Windows. (Не бесплатно... конечно.) Просто потому, что кто-то из вашей компании о чем-то попросил, это не лучшая идея!
Если вы добавите его в свое приложение, у людей возникнут проблемы с добавлением другого приложения на другую половину экрана. Если вы их обучите, они смогут использовать эту функцию во всех приложениях. И привязка к левой или правой половине экрана — это только часть функции, которую поддерживает Windows: support.microsoft.com/en-us/windows/… — вы действительно хотите добавить все эти параметры в свой приложение?
@StephenC это внутреннее приложение, конечными пользователями которого являются наши сотрудники. Я думаю, что ваша рекомендация может быть подходящей альтернативой автоматическому разделению экрана.




Вы находитесь в очень нестабильной зоне. В зависимости от предпочтений пользователя значения ширины поля, высоты/ширины панели задач или других настроек могут различаться. Если вы не используете функцию «Диспетчер окон» для позиционирования окна, вам придется провести лотерею с правильными значениями. Для этого из Java может потребоваться использование JNI и правильный вызов API Win32.
Поэтому я бы постарался избежать такой ситуации. Зачем вам это вообще нужно? И могло бы помочь, если бы ваше приложение сохраняло положение и размер окна при выходе, чтобы запомнить их при следующем запуске? Тогда пользователь по-прежнему сможет выбирать, где расположить окно, пока он не зафиксирован на левой или правой половине экрана.
Вот обходной путь, который позволил достичь желаемого результата. (Oracle JDK 21 в Windows 10)
JFrame развернутым, т. е. занимающим весь экран.JFrame.JFrame, отрегулируйте его размер.windowOpened вызывается только один раз — при первом отображении окна.)import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
public class TstFrame extends WindowAdapter {
@Override // java.awt.event.WindowAdapter
public void windowOpened(WindowEvent event) {
Window window = event.getWindow();
Dimension dim = window.getSize();
window.setSize(dim.width / 2, dim.height);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame testFrame = new JFrame();
testFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
testFrame.addWindowListener(new TstFrame());
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testFrame.setVisible(true);
});
}
}
Скриншот:
Это достаточно близко к желаемому поведению. Спасибо, что ответили, а не поучали! Просто пытаюсь делать свою работу здесь :P
Выведите значения
windowBounds.getMinX()иwindowBounds.getMinY(), а такжеgetMaximumWindowBounds()и убедитесь, что они разумны.