Много сводится к требованиям содержания и менеджера компоновки. Вместо того, чтобы смотреть, «насколько большой» вам нужен кадр, сосредоточьтесь на объеме пространства, в котором нуждается контент. После этого кадр будет «упакован».
Это означает, что рамка будет «размер контента + размер рамки рамки» большой.
JFrame#pack
принимает во внимание предпочтительный размер содержимого и автоматически добавляет в рамки рамки рамки.
Таким образом, единственное, что вам нужно, это позвонить JFrame#pack
ПОСЛЕ завершения добавления к нему содержимое
Таким образом, на основе кода:
public class Testing {
public static void main(String[] args) {
JFrame frame = new JFrame("hi");
for (int i = 0; i < 10; i++) {
JButton a = new JButton();
a.setSize(20,20);
a.setLocation(20*i, 0);
frame.getContentPane().add(a);
}
frame.setLayout(null);
frame.pack();
frame.setVisible(true);
}
}
Вы используете null
макет. JFrame#pack
будет использовать информацию, предоставленную менеджером макета, для определения «предпочтительного» размера общего содержимого.
Избегайте использования макетов null
, идеальные макеты пикселей являются иллюзией в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбрасывая их, не приведет к возникновению проблем и проблем, которые вы будете тратить все больше и больше времени на исправление.
Скорее, фокусировка на абсолютном значении, которая будет варьироваться между ОС (и даже разными ПК с той же ОС), сосредоточена на пользовательском опыте.
Как, уже было показано, вы можете легко получить эту работу с помощью GridLayout
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
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.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridLayout(10, 10, 0, 0));
for (int index = 0; index < 10 * 10; index++) {
JButton btn = new JButton(String.valueOf(index)) {
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
add(btn);
}
}
}
}
Если вам нужна более сложного управления (т.е. глубина по ширине), вам может использовать GridBagLayout
вместо
Посмотрите на Laying Out Components Within a Container, How to Use GridLayout и How to Use GridBagLayout для получения более подробной информации;)
Я не слишком хорош с формулировкой; Прошу прощения за смутное название. Если кто-то может отредактировать его, чтобы сделать немного больше ... смысла? Я был бы очень признателен за это :) –
Фактический размер кадра также составляет границу. – Constant
Я попытался использовать 'frame.getContentPane(). SetSize()', но это только начинает кадр в этом маленьком маленьком окне в верхнем левом углу. –