SetSize() не работает для JFrame

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
class Demo
{
 JFrame jf;
 Demo()
 {
 jf=new JFrame("Demo");
 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 jf.setSize(5000,5000);
 jf.setVisible(true);
 System.out.println(jf.getSize());
 }
 public static void main(String[] args)
 {
 SwingUtilities.invokeLater(new Runnable()
 {
 @Override
 public void run()
 {
 new Demo();
 }
 });
 }
}

Я использую jf.setSize(5000, 5000) для JFrame, но после этого getSize возвращает другой размер: java.awt.Dimension[width=1386,height=788] (разрешение экрана - 1366x768) Могу ли я установить размер кадра больше, чем размер экрана? возможно, такое поведение обеспечивается некоторыми свойствами фрейма, но я не знаю о них.

5 ответов

Попробуйте использовать setPreferredSize вместо setSize. Работает в моем случае (Ubuntu 12.04 + GNOME 3).


В javadoc сказано следующее:

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

Это охватывает поведение, которое вы наблюдаете/жалуетесь.

Это не кристально понятно, но одна из причин, по которой Window.setSize(...) имеет такое поведение, заключается в том, что диспетчеры окон (за пределами Java), как правило, накладывают вето на попытки приложения. Предположительно, это потому, что оно открыто для злоупотреблений и "не то, чего хочет пользователь". Во всяком случае, в конечном счете не ваше приложение вызывает переопределение ограничений на оконный менеджер.


Просто для удовольствия в пятницу (то есть ничего не стоит делать в производственной среде:-) - играя немного дальше с кодом @jinguy, я заметил, что размер файла больше, чем был использован, после минимизации кадра. Выполняя это программно, пусть он появляется как монстр с самого начала

jf.setPreferredSize(new Dimension(5000,5000));
 jf.setMinimumSize(new Dimension(5000,5000));
 jf.pack();
 jf.setVisible(true);
 jf.setState(Frame.ICONIFIED);
 jf.setState(Frame.NORMAL);
 System.out.println(jf.getSize());


Я опробовал несколько комбинаций вызовов, и, похоже, работала:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setPreferredSize(new Dimension(5000,5000));
jf.setMaximumSize(new Dimension(5000,5000));
jf.setMinimumSize(new Dimension(5000,5000));
jf.pack();
jf.setVisible(true);

Он по-прежнему печатает другой размер, но окно оказывается намного больше, чем печатает.


Это мои наблюдения (используется 1.6, теперь я использую 1.7 под XP):

У вас может быть ограниченный кадр "почти" любого размера - я использую разрешение экрана 1280x1024 (повернуто) и не заметил никаких проблем с рамой 1500x1500, хотя некоторые рамы 2000x2000 выглядят незавершенными (но работают) и кадром 4000x4000 отображает большой палец на панели задач, но этот большой палец неактивен, и сам кадр не отображается. Я думаю, что самый большой размер unecorated JFrame зависит от системных возможностей, которые зависят от графического оборудования.

С украшенными рамами есть простая история - они могут быть немного больше размера экрана (на несколько пикселей в целом).

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

1). перед упаковкой установите положение рамки относительно нуля. Он помещает верхний левый угол JFrame в середину экрана (перед тем, как пакет JFrame равен (0,0))

2). установите предпочтительные размеры содержимого моего кадра (я всегда использую один JPanel) и помню их

3). упаковать фрейм

4). если размеры кадров после пакета не совпадают с размерами перед упаковкой, удалите содержимое JPanel, добавьте JScrollPane с этим JPanel и установите предпочтительные размеры JScrollPane как предпочтительные размеры JPanel. PLUS фиксированные размеры JScrollBar (то есть ширину вертикальной полосы прокрутки и высота горизонтальной).

5). pack снова - это гарантирует появление только необходимых полос прокрутки (если вы не увеличиваете размеры JFrame, тогда появятся полосы прокрутки), также необходимо удалить границу JScrollPane по умолчанию).

6). установите новое местоположение кадра, перемещая его влево и вверх на половину соответствующего размера, чтобы центрировать его.

licensed under cc by-sa 3.0 with attribution.