Java - Установить размер украшенного JFrame
У меня проблема с размером JFrame:
Я хочу показывать контент в Jframe. Контент будет иметь размер 640 х 480. Но я не могу использовать метод JFrame.setSize(640, 480);
потому что я тоже хочу показать оформление окна. Моей первой мыслью было: добавить панель с предпочтительным размером, а затем использовать pack();. Но это также не работает - у меня только очень маленькое окно.
Я думаю, что решение моей проблемы может быть похоже на это:
Вот мой код:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Fenster extends JFrame {
JPanel panel;
Dimension dim;
Fenster(){
dim = new Dimension(640, 480);
panel = new JPanel();
panel.setSize(dim);
panel.setMinimumSize(dim);
panel.setMaximumSize(dim);
panel.setPreferredSize(dim);
panel.setBounds(0, 0, 640, 480);
panel.setDoubleBuffered(true);
JLabel label = new JLabel("bla");
panel.add(label);
this.setLayout(null);
this.getContentPane().add(panel);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
}
1 ответ
this.setLayout(null);
это твоя проблема. Пусть менеджер верстки сделает свое дело
Из JavaDocs
public void pack ()
Заставляет размер этого окна соответствовать предпочтительному размеру и расположению его подкомпонентов. Результирующая ширина и высота окна автоматически увеличиваются, если любое из измерений меньше минимального размера, указанного в предыдущем вызове метода setMinimumSize.
Если окно и / или его владелец еще не отображаются, оба они становятся отображаемыми до вычисления предпочтительного размера. Окно проверяется после расчета его размера.
Большинство контейнеров (JComponent
, JPanel
) по умолчанию, предпочтительный размер 0x0
менеджер компоновки предоставляет эту информацию на основе требований самого диспетчера компоновки и содержимого контейнера, но с использованием null
, вы эффективно делаете контейнер 0x0
...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
add(new JLabel("Look ma, no null layouts!"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
}
}
Избегать использования null
макеты, идеальные пиксельные макеты - иллюзия в современном дизайне пользовательского интерфейса. Есть слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отказ от которых не приведет к концу проблем и проблем, которые вы будете тратить все больше и больше времени, пытаясь исправить
См. Почему не рекомендуется использовать пустой макет в SWING? Больше подробностей...