Java Swing set «фактический» размер фрейма (внутри)

#java #swing #frame

#java #swing #фрейм

Вопрос:

У меня есть JFrame, который содержит только одну JPanel. Я попытался установить размер панели и упаковать фрейм, но это не дало никакого эффекта.

Если я установлю размер JFrame, он изменит размер, чтобы включить строку заголовка и границы. Как мне установить «фактический размер», чтобы он не включал строку заголовка и границы?

Пример:

Пример

Заранее спасибо, ребята

Ответ №1:

Вы могли бы установить предпочтительный размер ContentPane и пакет вызовов в JFrame, но в целом обычно лучше позволить компонентам самим определять размеры на основе их предпочтительных размеров, определенных их менеджерами компоновки.

Комментарии:

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

Ответ №2:

Это пример настройки размера JPanel и упаковки фрейма:

 JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(200, 200));
frame.add(panel);
frame.pack();
frame.setVisible(true);
  

Вы пробовали что-то подобное?

Комментарии:

1. Да, это то, что сказал корабль на воздушной подушке, полный угрей, действительно отлично работает.

2. Я видел его сообщение только после того, как отправил свое 🙂

3. Нет проблем, приятель, я также поддержал твой 🙂 хотя на этот раз я уже понял это, иногда я действительно не могу обойтись без примера 🙂

4. kleopatra тот же код не работает с setSize вместо setPreferredSize, но если вы знаете, как исправить, пожалуйста, скажите нам

Ответ №3:

Если вы установите предпочтительный размер JPanel, то метод pack () JFrame будет учитывать его.

Комментарии:

1. да, поскольку я предполагаю, что он добавляется в BorderLayout ContentPane. Положение по ЦЕНТРУ — но если что-то еще добавляется в другую позицию BorderLayout, это все испортит.

2. @Andrew, извините, я делаю много предположений, но предполагаю, что OP хочет установить размер графического интерфейса, за исключением границ, меню и т.д., Если размер определяется только BorderLayout . ЦЕНТРИРУЙТЕ компонент и добавляйте другие компоненты в другие позиции BorderLayout, тогда конечный размер графического интерфейса может быть неправильным. Но мои предположения были неверными, поскольку OP в основном интересует размер компонента, который содержит изображение. Итак, Винсент действительно прав, и я вскоре удалю свой первый комментарий к нему (и этот комментарий к вам).

Ответ №4:

Используйте .getInsets метод на JFrame , который дает вам размеры размеров вокруг неклиентской области.

Затем добавьте его к желаемому размеру и установите размер с помощью setSize .

Ответ №5:

Если вы хотите получить границу фрейма, сначала используйте pack для вашего фрейма, а после этого получите вставки фрейма, как в приведенном ниже коде:

 frame.pack();
Insets insets = frame.getInsets();
int frameLeftBorder = insets.left;
int frameRightBorder = insets.right;
int frameTopBorder = insets.top;
int frameBottomBorder = insets.bottom;
  

Лучше использовать метод pack сразу после вашего метода setResizable(boolean), потому что resizable по какой-то причине изменяет границы вашего фрейма, но если вы не используете метод resize, тогда используйте метод pack прямо в начале конструктора фрейма.

Комментарии:

1. Вау, за короткое время 2 голоса понижения, похоже, даже не стоит помогать людям.

Ответ №6:

Установка фактического размера полезного пространства в JFrame может быть выполнена путем установки предпочтительного размера контейнера в createComponents(Container container) методе. Выполненный таким образом, вы пропускаете настройку размера всего JFrame через setPreferredSize(new Dimension (width, length) в run() методе. Итак, код будет выглядеть следующим образом:

 @Override
public void run() {
    JFrame frame = new JFrame();
    // other code ...
    this.createCompoents(frame.getContentPane());
}

private void createCompoents(Container container) {
   // other code ...
   container.setPreferredSize(new Dimension(width, length));
}