setSize () не работает для JFrame - PullRequest
9 голосов
/ 02 марта 2012
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 ]

10 голосов
/ 27 марта 2013

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

7 голосов
/ 02 марта 2012

Javadoc говорит это:

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

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

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

5 голосов
/ 02 марта 2012

Просто для забавы в пятницу (то есть, вы ничего не должны делать в производственной среде :-) - играя немного дальше с кодом @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());
3 голосов
/ 02 марта 2012

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

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 голос
/ 02 июня 2012

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

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

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

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

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

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

3). упаковать кадр

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...