#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));
}