setSize () не работает для JFrame
Я использую jf.setSize(5000, 5000) для JFrame, но после этого getSize возвращает другой размер: java.awt.Dimension[width=1386,height=788] (у меня разрешение экрана 1366×768) Могу ли я установить размер кадра больше, чем размер экрана? возможно такое поведение обеспечивается некоторыми свойствами фрейма, но я о них не знаю.
5 ответов
Попробуйте использовать setPreferredSize вместо setSize. В моем случае работает (Ubuntu 12.04 + GNOME 3).
Вот мои наблюдения (использовал 1.6, теперь я использую 1.7 под XP):
У вас может быть недекорированный кадр «почти» любого размера — я использую разрешение экрана 1280×1024 (повернуто) и не заметил никаких проблем с кадром 1500×1500, хотя некоторые кадры 2000×2000 выглядят незавершенными (но работают), а кадр 4000×4000 показывает большой палец на панели задач, но этот ползунок неактивен, а сама рамка не отображается. Я думаю, что максимально возможный размер JFrame без декорирования зависит от возможностей системы, которые зависят от графического оборудования.
С декорированными рамками простая история — они могут быть немного больше размера экрана (в общем, на несколько пикселей).
В моем приложении, размер которого определяется во время выполнения (например, в играх, где вы устанавливаете размер доски динамически), я использую следующий подход:
1). перед упаковкой установите положение фрейма относительно нуля. Он помещает верхний левый угол JFrame в середину экрана (перед упаковкой JFrame имеет размер (0,0))
2). установить предпочтительные размеры содержимого моего фрейма (я всегда использую одну панель JPanel) и запомнить их
3). упаковать раму
4). если размеры кадра после пакета не совпадают с размерами до пакета, удалите JPanel содержимого, добавьте JScrollPane с этим JPanel и установите предпочтительные размеры JScrollPane как предпочтительные размеры JPanel ПЛЮС фиксированные размеры JScrollBar (т. е. ширину вертикальной полосы прокрутки и высота горизонтального).
5). pack снова — это гарантирует, что появятся только необходимые полосы прокрутки (если вы не увеличите размеры JFrame, обе полосы прокрутки будут отображаться всегда — также необходимо удалить границу JScrollPane по умолчанию).
6). установите новое положение рамки, перемещая ее влево и вверх на половину соответствующего размера, чтобы отцентрировать ее.
Я попробовал несколько комбинаций вызовов, и, похоже, работало следующее:
Он по-прежнему печатает другого размера, но окно кажется намного больше, чем печатается.
Просто ради пятничного веселья (то есть ничего, что вам не следует делать в производственной среде 🙂 — поиграв немного дальше с кодом @jinguy, я заметил, что после минимизации кадра использовался размер больше натурального. Сделав это программно, пусть он с самого начала будет выглядеть как монстр.
В javadoc говорится следующее:
«Метод изменяет данные, связанные с геометрией. Таким образом, собственная оконная система может игнорировать такие запросы или может изменять запрошенные данные, так что объект Window размещается и имеет размер, близкий к рабочему столу. настройки. «
Это касается поведения, на которое вы наблюдаете / жалуетесь.
Источник
setSize() not working?
I have a program which takes two buttons, one that is regular and one that has a picture that changes depending on mouse roll over. Currently, since the picture is large, JButton custom is very large as well, can I change the size of custom and keep the image (and roll over image) proportionate? I have tried setSize, and it does’t do anything. Any feedback would be appreciated!
Here is all of my code:
3 Answers 3
As some users have mentioned, you can override getPreferredSize() and getMinimum/MaximumSize() . Or you could just call the setter methods for the preferred, maximum, and minimum sizes. If you set the preferred size and the maximum size.
then you will usually get that size.
Start by having a look at Laying Out Components Within a Container. In Swing, and many other UI frameworks, you don’t actually control the size or position of components, but instead, through different mechanisms, provide hints and constraints that allow layout managers to make the final decisions before you.
Now, before you suddenly decide that layout managers a «bad idea» and «you can do better», avoid using null /absolute layouts, pixel perfect layouts are an illusion within modern ui design. There are too many factors which affect the individual size of components, none of which you can control. Swing was designed to work with layout managers at the core, discarding these will lead to no end of issues and problems that you will spend more and more time trying to rectify
If you «really» want to effect the size of a component, then you should override the getPreferredSize (and/or getMinimumSize / getMaximumSize ) method and return your required values. Beware though, these are only hints and some layout managers will ignore them (or only use them for their initial calculations)
Источник
JPanel не имеет размера, установленного в методе setSize
В своей программе я добавляю JPannel, который использую в качестве холста в JFrame. Проблема в том, что размер JPannel # setSize () не соответствует отображаемому. Сначала у меня была проблема, более или менее похожая на эту, и я спросил здесь Вопросы Java о координатах с графикой Они сказали мне добавить JPannel и использовать метод pack (), и это сработало, но я не могу заставить его работать сейчас, потому что JFrame больше, чем JPannel, где я рисую. Я просмотрел несколько тем, чтобы узнать, смог ли я найти ответ, но мне это не удалось. Вот темы, которые я просмотрел:
Я создаю JFrame с помощью setSize (600, 400); и я добавляю панель. Вот код
А вот и класс холста
А вот и класс ACanvas
Похоже, на высоте это не работает. В классе холста у меня есть событие щелчка мыши, которое отображает положение щелчка. Ширина, которую я щелкаю, и вывод — это кодировка вроде (0,?) Для левого и (400,?) Для правого. Проблема в высоте: вверху я получаю (?, 0), но внизу самое высокое значение, которое я мог получить, — (?, 370), а не (?, 400). У меня вопрос: почему дно не доходит до (?, 400)? Спасибо за помощь, если что-то непонятно просто спросите
РЕДАКТИРОВАТЬ: Другие классы программы: Векторный класс:
И интерфейсы Drawable и Updateable:
1 ответ
Я вижу здесь много комментариев (все действительные), но вопрос, который вы задаете, заключается в том, почему на холсте отображается что-то вроде
370 вместо 400 с правой стороны (если я правильно прочитал ).
Ваш холст, вероятно, имеет размер x,y(400,400) , но родительский контейнер имеет ширину всего 400 пикселей в зависимости от вашего первоначального вызова. Есть большая вероятность, что граница вашего окна и другие элементы, специфичные для операционной системы, добавляют довольно много пикселей (в Windows Vista / 7 я, кажется, помню, что это было
30 пикселей), так что есть действительно хороший шанс, что проблема.
В качестве побочного примечания (написав несколько симуляций частиц в Java / Processing) я могу сказать, что вы, возможно, захотите взглянуть на стиль позиционирования OpenGL с использованием float от -1.0f / 1.0f, представляющего ваш холст, вместо того, чтобы пытаться делать все в целых числах. Во-первых, у вас будет много прерывистых «отскоков» при работе с целыми числами, поскольку вам нужно будет представлять значения между пикселями. Во-вторых, это позволяет очень легко изменить размер вашей симуляции на произвольную ширину x / y.
Удачи, я перестал писать графические интерфейсы на Java пять или шесть лет назад, так что я немного заржавел. Нулевые макеты могут быть проблематичными, я бы рекомендовал выбрать диспетчер макетов и использовать setPreferredSize (моим любимым был GridBag).
Источник
Почему метод JFrame setSize () не устанавливает размер правильно?
Итак, я программировал на java в течение семестра или около того, и у меня была эта проблема несколько раз и, наконец, собрался спросить.
если я делаю JFrame а затем установить размер, как setSize(400,800) например. Кадр на самом деле не 800 pixels долго. Из того, что я могу сказать, это на самом деле больше похоже 770 (or maybe 769) pixels долго. Кроме того, если вы установите вертикальный размер очень низкий (ниже 30), рамка даже не отображается, только верхняя панель окна из ОС, и рамка не становится больше, пока вы не пойдете до значения более 30 (so setSize(400,0) выглядит так же, как setSize(400,20) ). Почему это, это не трудно исправить, но это странно, и мне любопытно, почему это так?
Если вам нужна дополнительная информация о чем-либо, просто спросите, и я передам ее вам.
6 ответов
Это, вероятно, потому, что размер кадра включает в себя размер границы.
фрейм-это окно верхнего уровня с заголовком и границей. Размер рамки включает в себя любую область, предназначенную для границы. Размеры пограничной области могут быть получены с помощью метода getInsets. Поскольку область границы включена в общий размер кадра, граница эффективно затемняет часть кадра, ограничивая область, доступную для рендеринга и / или отображения подкомпоненты к прямоугольнику, который имеет расположение в верхнем левом углу (вставки.слева, вставки.сверху), и имеет размер width — (insets.слева + вставки.справа) по высоте — (вставки.топ + вставки.нижний.)
JFrame SetSize () содержит область + граница.
Я думаю, вы должны установить размер ContentPane этой
поэтому я бы посоветовал вам использовать JPanel, встроенный в JFrame, и вы рисуете на этой JPanel. Это минимизирует вашу проблему.
на JFrame — класс слегка несовместимо с Frame . Как все другие JFC / качели верхнего уровня стеклотара, а JFrame содержит JRootPane как его единственный ребенок!—24—>. The панели содержимого при условии к корневой панели следует, как правило, содержать все компоненты, не относящиеся к меню отображается JFrame . Это отличающийся от случай рамки AWT. Для пример добавления ребенка в AWT кадр вы напишете:
используя JFrame вам нужно добавить ребенка ‘ы вместо этого:
есть много веских причин для установки размера кадра. Один из них-запомнить последний размер, установленный пользователем, и восстановить эти настройки. У меня есть этот код, который, кажется, работает для меня:
в OS X необходимо учитывать существующие декорации окон. Они добавляют 22 пикселя к высоте. Поэтому на JFrame вам нужно сказать программе следующее:
Я знаю, что этот вопрос о 6+ лет, но ответ @Kyle не работает.
но это всегда работает в любом размере:
Если вы не хотите, чтобы граница граничила, и хотите только белую область, здесь:
также это работает только на Windows 10, для пользователей MacOS используйте ответ @ben.
верхняя граница рамки имеет размер 30.Вы можете написать код для печати координаты любой точки На кадре с помощью MouseInputAdapter.Вы обнаружите, что когда курсор находится чуть ниже верхней границы кадра, координата y не равна нулю, она близка к 30.Следовательно, если вы даете размер кадру 300 * 300, размер, доступный для размещения компонентов на кадре, составляет всего 300 * 270.Поэтому, если вам нужно иметь размер 300 * 300, дайте 300 * 330 размер рамки.
Источник
Панель Java игнорирует setSize
У меня та же проблема, что описана здесь, но ни один ответ не сработал для меня .
У меня есть Panel с BoxLayout с Axis = Y Axes , потому что я хотел бы складывать элементы один под другим, но я хотел бы иметь возможность выровнять элементы по правому краю и слева, так что теперь я вставляю в эту панель другие панели:
Однако это не работает, поскольку результат следующий:
Однако предполагаемый результат должен быть похож на одно сообщение под другим без какого-либо пробела между сообщениями . что мне не хватает?
1 ответ
Это утверждение не имеет смысла. Это означает, что вы используете BorderLayout, когда в вашем вопросе указано, что вы используете BoxLayout. При использовании BoxLayout вы не указываете ограничение.
У меня есть панель с BoxLayout с Axis = Y Axes,
BoxLayout учитывает максимальный размер компонентов.
Поэтому, когда на родительской панели появляется дополнительное пространство, каждая дочерняя панель будет расти, пока не будет использовано все дополнительное пространство.
Не играйте с размером или методами предпочтительного размера.
Одно из решений — использовать панель-оболочку, которая соответствует предпочтительной высоте всех дочерних панелей.
Итак, ваш код должен быть примерно таким:
Теперь высота панели «чат» будет соответствовать предпочтительной высоте каждого добавляемого к ней компонента.
Источник