Есть две основные проблемы ...
То, что вы не учли, этотот факт, что объем пространства, доступного для содержимого окна, равен размеру окна МИНУС украшений кадра.
Пиксельные макеты являются иллюзией в современной разработке пользовательского интерфейса и их лучше избегать.
Вы могли бы взглянуть на:
для получения более подробной информации.
Лучшее решение - использовать один или несколько доступных менеджеров компоновки.В приведенном ниже примере просто используются BorderLayout
и GridLayout
с помощью EmptyBorder
для обеспечения некоторого заполнения
См. Компоновка компонентов в контейнере для получения более подробной информации
![Simple](https://i.stack.imgur.com/yq3az.png)
Преимущества
- Адаптируемый макет:
- В примере используется
pack
для«упаковать» окно вокруг содержимого автоматически, без необходимости адаптировать свой код к работающей в данный момент ОС (или оформлению фрейма, обеспечиваемому другим внешним видом и интерфейсом) - Пользователь может изменить размер окна иразмер контента изменится автоматически - бонус для пользователя.
- Макет будет адаптирован к системным настройкам пользователя, поэтому, если они используют шрифт большего размера, чем вы рассчитывали, он не будет полностью взорванваше лицо
- Хотите добавить больше кнопок?Не беспокойтесь, выбейте себя из строя, просто добавьте больше кнопок, раскладка будет адаптироваться автоматически, не нужно «нажимать на пиксели» когда-либо компонент на экране
Пример запуска ...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
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 BorderLayout());
setBorder(new EmptyBorder(10, 10, 10, 10));
add(new SizablePane(430, 530));
JPanel buttonPane = new JPanel(new GridLayout(1, 3, 20, 0));
buttonPane.setBorder(new EmptyBorder(10, 0, 0, 0));
buttonPane.add(new JButton("Add"));
buttonPane.add(new JButton("Delete"));
buttonPane.add(new JButton("Refresh"));
buttonPane.add(new JButton("Developer"));
add(buttonPane, BorderLayout.SOUTH);
}
}
public class SizablePane extends JPanel {
private Dimension size;
public SizablePane(int width, int height) {
size = new Dimension(width, height);
setBackground(Color.RED);
}
@Override
public Dimension getPreferredSize() {
return size;
}
}
}
Нужно добавить больше кнопок?Легко ...
JPanel buttonPane = new JPanel(new GridLayout(1, 0, 20, 0));
buttonPane.setBorder(new EmptyBorder(10, 0, 0, 0));
buttonPane.add(new JButton("Add"));
buttonPane.add(new JButton("Delete"));
buttonPane.add(new JButton("Refresh"));
buttonPane.add(new JButton("Developer"));
buttonPane.add(new JButton("Some"));
buttonPane.add(new JButton("More"));
buttonPane.add(new JButton("Buttons"));