@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как ограничить перемещение окна JFrame границами экрана?

Есть undecorated окно JFrame, которое я перемещаю вручную с помощью функции ниже. Получилось блокировать перемещения за левый и верхний края экрана, а вот с противоположными беда. В комментариях два способа, которыми я пробовал это сделать для правой границы. Они работают, но окно "скачет", вместо того, чтобы просто остановиться на краю экрана, как оно это делает с левым и верхним краем. Подскажите, как мне исправить функцию, чтобы она заработала как нужно?

функция
private void registerMouseEvents(JFrame parent) {

	parent.addMouseListener(new MouseAdapter() {
		public void mousePressed(MouseEvent e) {
			mouseX = (int) e.getPoint().getX();
			mouseY = (int) e.getPoint().getY();
		}
	});

	parent.addMouseMotionListener(new MouseMotionAdapter() {
		@Override
		public void mouseDragged(MouseEvent e) {
			int newX = parent.getLocation().x + e.getX() - mouseX;
			int newY = parent.getLocation().y + e.getY() - mouseY;

			if (getLocation().x > newX)
				newX = getLocation().x;

			if (getLocation().y > newY)
				newY = getLocation().y;

			if (parent.getLocation().x + parent.getWidth() > width)
				System.out.println("move outside right");
				// newX = width - parent.getWidth(); // don't work
				// newX = getLocation().x; // don't work

			if (parent.getLocation().y + parent.getHeight() > heigth)
				System.out.println("move outside bottom");

			parent.setLocation(newX, newY);
		}
	});
}


mouseX и mouseY - целочисленные переменные класса, которые больше нигде не используются.
width и heigth - целочисленные переменные класса; значения ширины и высоты экрана, определяются при инициализации класса:
width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
heigth = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Deiwan
Я не совсем понял что вы имели ввиду, но если вам нужно чтобы кнопка автоматически вставала в окно вам нужен layout (макет)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы