setresizable java что делает

Java setResizable (false) изменяет размер окна (swing)

у меня странная проблема. Я использую нулевой макет для окна (=JFrame и в windows), и если я использую setResizable (false), размер окна становится больше (справа и внизу, около 10 пикселей, я бы сказал). Не знаю почему.

два println возвращают одинаковые размеры, что тоже странно.

есть ли у кого-нибудь идея? Почему размер окна изменяется?

обновление: То же самое здесь (скомпилируйте его с и без setResizable и чем вы можете это увидеть, если вы перекрываете окна):

7 ответов

Он не меняется на моем примере, поэтому у вас должно быть что-то еще, что вызывает вашу проблему:

каким-то образом вставки неверны, когда вы устанавливаете изменяемое значение false (по крайней мере, в Windows 7 и JDK 6). Каким-то образом они меняются от 30,8,8,8 до 25,3,3,3, хотя граница (которая окрашена ОС) остается фактически неизменной. Поскольку вставки являются частью границ кадра, кадр на самом деле слишком большой (визуально), когда он не может быть изменен. Для мне кажется, что в вычисленных вставках есть ошибка, когда кадр не изменяется.

Если вы установите setResizable false перед установкой границ, у вас не будет проблемы. как заявил ранее Гергели Силаги, вы избавляетесь от полос прокрутки, но размер окна заблокирован, и поэтому вы получаете 9 или 10 пикселей дополнительного пространства в кадре. У меня была та же проблема. спасибо за помощь.

в зависимости от настройки L&F изменение размера(false/true) может изменить оформление границы окна. Нет максимизации, нет стрелки изменения размера. Что само по себе может изменить размер.

Ну, я встретил эту проблему, и это проблема Look & Feel.

почему изменяемый размер кадра имеет вставки (5, 5, 5, 5)? Это заставляет меня думать, что make it resizable добавляет дополнительный компонент вокруг кадра, например. какой-то» обработчик » для перетаскивания для изменения размера?

мой собственный вопрос и мой ответ с GIF здесь:

У меня есть 2 подкласса JFrame. Если я запускаю фрейм проблемы в автономном приложении, размер фрейма правильный. Если я запускаю оба фрейма в автономном приложении, фрейм проблемы все еще больше. Я сделал setResizable (false) перед pack, и я все еще получаю проблему. Мой обходной путь состоял в том, чтобы изменить макет на BorderLayout и шлепнуть панель (изображение) в центре, а затем сделать setResizable.

Источник

Java setResizable (false) изменяет размер окна (swing)

У меня странная проблема. Я использую нулевой макет для окна (= JFrame и для окон), и если я использую setResizable (false), размер окна становится больше (справа и внизу, около 10 пикселей, я бы сказал). Я не знаю, почему.

Два println возвращают одинаковые размеры, что странно, также…

Есть ли у кого-то идея? Почему окно изменяется?

UPDATE:
То же самое здесь (скомпилируйте его с помощью setResizable и без него, и вы можете увидеть его, если вы перекрываете окна):

В моем примере это не меняется, поэтому у вас должно быть что-то еще, что вызывает вашу проблему:

В некоторых случаях вставки неверны, если вы устанавливаете изменяемый размер в false (по крайней мере, в Windows 7 и JDK 6). Так или иначе они меняются от 30,8,8,8 до 25,3,3,3, хотя граница (которая окрашена ОС) остается на самом деле одинаковой. Поскольку вставки являются частью границ кадра, кадр на самом деле слишком большой (визуально), когда он не изменяется. Для меня это похоже на ошибку в вычисленных вставках, когда кадр не изменяется.

Если вы установите setResizable false перед установкой границ, у вас не будет проблемы. как ранее заявлял Гергили Ссилаги, вы избавляетесь от полос прокрутки, но размер окна заблокирован, и поэтому вы получаете 9 или 10 пикселей дополнительного пространства в кадре. У меня была такая же проблема. спасибо за помощь.

В зависимости от настройки L & F изменяемый размер (false/true) может изменить декорации границ окна. Без увеличения, без изменения размера стрелки. Это само по себе может изменить размер.

У меня есть 2 подкласса JFrame. Если я запускаю проблему в автономном приложении, размер кадра правильный. Если я запускаю оба фрейма в автономном приложении, проблема будет еще больше. Я сделал setResizable (false) перед пакетом, и у меня все еще проблема. Мое обходное решение состояло в том, чтобы изменить макет на BorderLayout и перевернуть панель (изображение) в центре, а затем сделать setResizable.

Ну, я встретил эту проблему, и это проблема Look and Feel…

Почему у изменяемого размера рамки есть вставки (5, 5, 5, 5)? Это заставляет меня думать, что делает его изменчивым добавляет дополнительный компонент вокруг фрейма, например… какой-то “обработчик” для перетаскивания для изменения размера?

Мой собственный вопрос и мой ответ с GIF здесь:

Источник

Java setResizable(false) changes the window size (swing)

I have a strange problem. I am using the null layout for a window (= JFrame and on windows) and if I use setResizable (false) the window size gets bigger (to right and bottom, around 10 pixels I would say). I do not know why.

The two println’s return the same sizes, what is strange, also.

Does somebody has an idea? Why does the window gets resized?

UPDATE: Same thing here (compile it with and without the setResizable and than you can see it, if you overlap the windows):

7 Answers 7

It does not change on my example, so you must have something else that causes your issue:

Somehow insets are incorrect when you set the resizable to false (at least on Windows 7 and JDK 6). Somehow they change from 30,8,8,8 to 25,3,3,3 although the border (which is painted by the OS) stays actually the same. Since insets are part of the bounds of the Frame, the frame is actually too big (visually) when it is not resizable. For me it looks like there is a bug in the computed insets when the frame is not resizable.

If you set setResizable false before setting the bounds, you will not have the problem. as Gergely Szilagyi stated before, you are getting rid of the scrollbars, but the size of the window is locked and therefore you end up with 9 or 10 pixels of extra space in the frame. I just had the same problem. thanks for the help.

Depending on the L&F setting the resizable(false/true) might change the window border decorations. No maximize, no resize arrow. That itself can change the size.

Well I have met this problem and it is a Look & Feel problem.

Why the resizable frame has an insets of (5, 5, 5, 5)? It leads me to think that make it resizable adds some extra component around the frame, like. some kind of «handler» to drag to resize?

My own question and my answer with GIF is here:

setresizable java что делает. Смотреть фото setresizable java что делает. Смотреть картинку setresizable java что делает. Картинка про setresizable java что делает. Фото setresizable java что делает

setresizable java что делает. Смотреть фото setresizable java что делает. Смотреть картинку setresizable java что делает. Картинка про setresizable java что делает. Фото setresizable java что делает

I have a 2 JFrame subclasses defined. If I run the problem frame in a standalone app, the frame size is correct. If I run both frames in a standalone app, the problem frame is still larger. I did setResizable(false) before pack, and I still get the problem. My workaround was to change the layout to BorderLayout and plop the (image) panel in the center, then did the setResizable.

Not the answer you’re looking for? Browse other questions tagged java swing window or ask your own question.

Linked

Related

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.12.22.41046

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

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

И ни одно решение не работает для меня. Вот мой SSCCE:

Я замечаю, что не только окна меняют размер, но и заголовок также меняет высоту. Это лучше иллюстрируется этим GIF:

setresizable java что делает. Смотреть фото setresizable java что делает. Смотреть картинку setresizable java что делает. Картинка про setresizable java что делает. Фото setresizable java что делает

Мы можем видеть все данные, которые нам нужны в этом примере. Когда кадр не изменяется:

Когда размер кадра изменяется:

Итак, когда кадр не будет изменяться, его панель содержимого добавит вставки (5, 5, 5, 5) и для поддержания общего размера JFrame, строка заголовка будет сжата на 10 пикселей. Это абсурдно.

Я тестировал с и без Nimbus L & F, это не имеет значения.

Как это можно и допускать?

Как мы можем это решить?

В конце концов, это проблема Look and Feel.

Если мы используем стиль Java по умолчанию Metal и устанавливаем setDefaultLookAndFeelDecorated(true) перед созданием обоих фреймов, границы/вставки стиля отображения по умолчанию Java по умолчанию будут нарисованы и видны, поэтому два JFrames имеют одинаковую ширину и высоту.

Этот GIF показывает вам, как по умолчанию Metal L & F рисует «дескриптор» изменения размера в обоих кадрах:
setresizable java что делает. Смотреть фото setresizable java что делает. Смотреть картинку setresizable java что делает. Картинка про setresizable java что делает. Фото setresizable java что делает

Источник

Занятие 8

Введение в библиотеку Swing

Библиотека Swing

Современные программы нуждаются в графическом интерфейсе пользователя (GUI). Пользователи отвыкли работать через консоль: они управляют программой и вводят входные данные посредством так называемых элементов управления (в программировании их также называют визуальными компонентами), к которым относятся кнопки, текстовые поля, выпадающие списки и т.д.

Каждый из современных языков программирования предоставляет множество библиотек для работы со стандартным набором элементов управления. Напомним, что под библиотекой в программировании набор готовых классов и интерфейсов, предназначенных для решения определенного круга задач.

В Java есть три библиотеки визуальных компонентов для создания графического интерфейса пользователя. Самая ранняя из них называется AWT. Считается, что при ее проектировании был допущен ряд недочетов, вследствие которых с ней довольно сложно работать. Библиотека Swing разработана на базе AWT и заменяет большинство ее компонентов своими, спроектированными более тщательно и удобно. Третья, самая новая библиотека, называется SWT.

Каждая библиотека предоставляет набор классов для работы с кнопками, списками, окнами, меню и т.д., но эти классы спроектированы по-разному: они имеют различный набор методов с разными параметрами, поэтому «перевести» программу с одной библиотеки на другую (например, с целью увеличения быстродействия) не так-то просто. Это почти как перейти с одного языка программирования на другой: все языки умеют делать одно и то же, но у каждого из них свой синтаксис, своя программная структура и свои многочисленные хитрости.

По этой причине вместо того, чтобы делать обзор всех трех библиотек, мы постараемся получше разобраться в одной из них — библиотеке Swing. Полноценный графический интерфейс может быть разработан с ее помощью.

Окно JFrame

Каждая GUI-программа запускается в окне и по ходу работы может открывать несколько дополнительных окон.

В Swing есть еще несколько классов окон. Например, JWindow — простейшее окно, без рамки и без строки заголовка. Обычно с его помощью делается заставка к программе, которая перед запуском должна выполнить несколько продолжительных действий (например, загрузить информацию из БД).

Чтобы написать простейшую программу, выводящую на экран пустое окно, нам потребуется еще три метода:

setSize(int width, int height) — устанавливает размеры окна. Если не задать размеры, окно будет иметь нулевую высоту независимо от того, что в нем находится и пользователю после запуска придется растягивать окно вручную. Размеры окна включают не только «рабочую» область, но и границы и строку заголовка.

Теперь мы можем написать программу, которая создает окно, выводит его на экран и завершает работу после того, как пользователь закрывает окно.

Обратите внимание, для работы с большинством классов библиотеки Swing понадобится импортировать пакет java.swing. *

Как правило, перед отображением окна, необходимо совершить гораздо больше действий, чем в этой простой программке. Необходимо создать множество элементов управления, настроить их внешний вид, разместить в нужных местах окна. Кроме того, в программе может быть много окон и настраивать их все в методе main() неудобно и неправильно, поскольку нарушает принцип инкапсуляции: держать вместе данные и команды, которые их обрабатывают. Логичнее было бы, чтобы каждое окно занималось своими размерами и содержимым самостоятельно. Поэтому классическая структура программы с окнами выглядит следующим образом:

В файле SimpleWindow.java:

В файле Program.java:

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

Панель содержимого

В примерах этого занятия мы будем использовать только один элемент управления — кнопку (не вдаваясь в подробности ее устройства). Кнопка описывается классом JButton и создается конструктором с параметром типа String — надписью.

Добавим кнопку в панель содержимого нашего окна командами:

JButton newButton = new JButton(); getContentPane().add(newButton);

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

Класс Container (контейнер)

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

add(Component component) — добавляет в контейнер элемент component ;

remove(Component component) — удаляет из контейнера элемент component ;

removeAll() — удаляет все элементы контейнера;

getComponentCount() — возвращает число элементов контейнера.

Класс JPanel (панель)

Менеджер последовательного размещения FlowLayout

Менеджеры расположения описаны в пакете java.awt. Не забывайте импортировать нужные классы.

Пронаблюдайте за поведением окна, появляющегося после запуска программы. Четыре кнопки в нем расположены как слова в текстовом редакторе (при выравнивании по центру). Эффект будет лучше заметен, если изменять размеры окна во время работы программы.

Проанализируем текст примера. Новый менеджер расположения FlowLayout создается конструктором без параметров. Обратите внимание, в программе не используется промежуточная переменная. То есть вместо двух команд:

FlowLayout newLayout = new FlowLayout(); panel.setLayout(newLayout);

Мы используем одну:

panel.setLayout( new FlowLayout());

Это вполне допустимо в тех случаях, когда в дальнейшем нам не потребуется обращаться к создаваемому объекту (что справедливо для данного примера). Мы создаем менеджер расположения, тут же привязываем его к панели — и все. Теперь панель и менеджер сами найдут друг с другом общий язык.

Кстати, класс JPanel кроме конструктора без параметров, имеет конструктор, в котором в качестве параметра задается менеджер расположения. Поэтому вместо команд

JPanel panel = new JPanel(); panel.setLayout( new FlowLayout());

JPanel panel = new JPanel( new FlowLayout());

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

Метод setContentPane(JPanel panel) позволяет заменить панель содержимого окна.

Менеджер граничного размещения BorderLayout

Менеджер размещения BorderLayout разделяет панель на пять областей: центральную, верхнюю, нижнюю, правую и левую. В каждую из этих областей можно добавить ровно по одному компоненту, причем компонент будет занимать всю отведенную для него область. Компоненты, добавленные в верхнюю и нижнюю области, будут растянуты по ширине, добавленные в правую и левую — по высоте, а компонент, добавленный в центр, будет растянут так, чтобы полностью заполнить оставшееся пространство панели.

Эффект будет хорошо наблюдаться, если изменять размеры окна.

Данное размещение не случайно используется в панели содержимого по умолчанию. Большинство программ пользуются областями по краям окна, чтобы расположить в них панели инструментов, строку состояния и т.п. А ограничение на один компонент в центральной области абсолютно не существенно, ведь этим компонентом может быть другая панель со множеством элементов и с любым менеджером расположения.

Менеджер табличного размещения GridLayout

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

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

Менеджер блочного размещения BoxLayout и класс Box

Менеджер BoxLayout размещает элементы на панели в строку или в столбец.

Понять особенности работы этого менеджера лучше на наглядном примере. Мы расположим четыре кнопки вертикально, поставив между двумя центральными «пружину», а между остальными — распорки в 10 пикселов.

Особенности выравнивания элементов

В примере с вертикальной панелью все кнопки оказались выровнены по левому краю. Такое выравнивание по горизонтали принято по умолчанию.

Однако выравнивание работает несколько иначе, чем ожидается. Чтобы это обнаружить, изменим предыдущий пример, выровняв третью кнопку по правому краю. Для этого заменим строку:

box.add( new JButton( «-» ));

JButton rightButton = new JButton( «-» ); rightButton.setAlignmentX(JComponent.RIGHT_ALIGNMENT); box.add(rightButton);

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

После запуска программы мы увидим окно, в котором кнопки расположены не так, как, наверное, ожидалось. Мы привыкли, что выравнивание по правому краю прижимает объект к правому краю контейнера, но в данном случае перестроились все элементы, причем кнопка с выравниванием по правому краю оказалась самой левой.

Объяснение просто. При выравнивании по правому краю объект не прижимается к правому краю компонента. Вместо этого он прижимается правым краем к невидимой линии выравнивания. Все остальные компоненты прижимаются к этой линии своим левым краем, поэтому и получается наблюдаемый эффект.

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

Параметр выравнивания на самом деле представляет собой вещественное число в диапазоне от 0 до 1. Он показывает, какая часть компонента окажется слева от линии выравнивания, т.е. в каких пропорциях компонент будет «разрезан». Константы LEFT_ALIGNMENT и TOP_ALIGNMENT на самом деле равны 0, RIGHT_ALIGNMENT и BOTTOM_ALIGNMENT равны 1, а CENTER_ALIGHNMENT — 0.5. Можно подставлять эти числа напрямую (хотя использование констант значительно повышает наглядность!), а можно выбрать любое другое число от 0 до 1 и настроить совершенно произвольное выравнивание.

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

Ручное размещение элементов

Координаты элемента можно задать одним из следующих методов:

Размер элемента задается одним из двух методов:

Создадим панель, с которой не будет связано никакого менеджера размещения и вручную разместим на ней две кнопки:

Мы используем одну и ту же переменную button для обращения к обеим кнопкам (причем, второй раз ее описывать не нужно). В самом деле, осуществив все необходимые операции с первой кнопкой и зная, что обращаться к ней нам больше не понадобится, мы используем «освободившуюся» переменную для манипуляций со второй.

Автоматическое определение размеров компонентов

Способ определения координат элементов очевидным образом вытекает из алгоритмов работы каждого менеджера и, таким образом, детально рассмотрен нами выше.

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

Менеджер FlowLayout всегда устанавливает предпочтительные размеры элементов. Менеджер BorderLayout устанавливает предпочтительную ширину правого и левого, а также предпочтительную высоту верхнего и нижнего. Остальные размеры подгоняются под доступное пространство панели. Менеджер GridLayout пытается подогнать размеры всех элементов под размер ячеек. Менеджер BoxLayout ориентируется на предпочтительные размеры.

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

Всеми тремя размерами можно управлять с помощью соответствующим методов set:

Чаще всего используется простой прием, когда элементу «не рекомендуется» увеличиваться или уменьшаться относительно своих предпочтительных размеров. Это легко сделать командой:

«Упаковка» окна

Оцените работу этого метода, заменив в каждом из вышеприведенных примеров команду

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

Упражнение

Как уже отмечалось, элементом панели может быть другая панель. Создайте панель с тремя кнопками и менеджером размещения FlowLayout и панель с двумя кнопками и менеджером размещения BoxLayout (горизонтальным). Разместите обе панели в главном окне (не изменяя менеджера размещения у панели содержимого): одну в центр, а другую вдоль любой стороны окна.

Рамки

Когда панели служат не просто для размещения элементов в соответствии с алгоритмом некоторого менеджера, а для визуального отделения их друг от друга, они оформляются с помощью рамок.

EmptyBorder — пустая рамка, позволяет создать отступы вокруг панели. Размеры отступов задаются в конструкторе четырьмя целыми числами.

TitledBorder — рамка с заголовком. Простейший конструктор имеет один параметр типа String (текст заголовка). Заголовок может размещаться вдоль любой стороны рамки, иметь различные начертания.

EtchedBorder — рамка с тиснением. Может быть вогнутой или выпуклой.

BevelBorder — объемная рамка (выпуклая или вогнутая). Можно настроить цвета, требуемые для получения объемных эффектов.

SoftBevelBorder — то же самое, что BevelBorder, но позволяет дополнительно скруглить углы.

LineBorder — простая рамка, нарисованная сплошной линией. Можно выбирать цвет и толщину линии, скруглить углы.

MatteBorder — рамка из повторяющегося рисунка.

CompoundBorder — объединяет две рамки, передаваемые в качестве параметров конструктору в одну новую рамку.

Все перечисленные классы описаны в пакете javax.swing.border.

Рассмотрим пример. В этом примере мы создадим шесть панелей с различными рамками и разместим их в виде таблицы. Чтобы не описывать шесть раз процедуру создания новой панели, вынесем ее в отдельный метод:

private JPanel createPanel(Border border, String text)

Метод createPanel() создает панель с кнопкой во весь свой размер. В качестве параметра передается надпись на кнопке и рамка, которую необходимо добавить к панели. Рамка добавляется не напрямую, а путем композиции с пустой рамкой. Этот прием часто используется, чтобы рамка не прилипала к краю панели.

Теперь шесть раз воспользуемся этим методом в конструкторе окна программы.

Класс ImageIcon описывает графическое изображение. Параметр его конструктора — это путь к файлу, из которого изображение может быть загружено. В примере используется относительное имя файла «1.gif». Чтобы объект ImageIcon был успешно создан, файл с таким именем должен быть помещен в папку проекта.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *