Автоматически размер JPanel внутри JFrame
У меня есть подкласс JPanel, в который я добавляю buutons, labels, tables и т. д. Чтобы показать на экране, я использую JFrame:
MainPanel mainPanel = new MainPanel(); //JPanel subclass
JFrame mainFrame = new JFrame();
mainFrame.setTitle("main window title");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setLocation(100, 100);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
но когда я размер окна, размер панели не меняются. Как сделать размер панели такой же, как размер окна, даже если он был изменен?
5 ответов
вы можете установить менеджер макетов, такой как BorderLayout, а затем определить более конкретно, куда должна идти ваша панель:
MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);
это помещает панель в центральную область кадра и позволяет ей автоматически расти при изменении размера кадра.
вам нужно установить менеджер макетов для использования JFrame - это касается расположения компонентов. Полезным является менеджер BorderLayout.
простое добавление следующей строки кода должно устранить ваши проблемы:
mainFrame.setLayout(new BorderLayout());
(сделайте это перед добавлением компонентов в JFrame)
Если опция BorderLayout, предоставленная нашими друзьями, не работает, попробуйте добавить ComponentListerner в JFrame и реализовать метод componentResized(event). Когда объект JFrame будет изменен, этот метод будет вызван. Поэтому, если вы напишете код для установки размера JPanel в этом методе, вы достигнете предполагаемого результата.
Я, Я знаю, что это "решение" не очень хорошо, но использовать его в качестве подстраховки. ;)
по моему опыту, я использовал GridLayout.
thePanel.setLayout(new GridLayout(a,b,c,d));
a = номер строки, b = номер столбца, c = горизонтальный зазор, d = вертикальный зазор.
например, если я хочу создать панель с:
- неограниченная строка (установить a = 0)
- 1 столбец (набор b = 1)
- вертикальный зазор= 3 (Набор d = 3)
код ниже:
thePanel.setLayout(new GridLayout(0,1,0,3));
этот метод полезен, когда вы хотите добавить JScrollPane в свой Для jpanel. Размер JPanel внутри JScrollPane автоматически изменится при добавлении на него некоторых компонентов, поэтому jscrollpane автоматически сбросит полосу прокрутки.
Как говорили другие плакаты, вам нужно изменить используемый LayoutManager. Я всегда предпочитал использовать GridLayout, чтобы ваш код стал:
MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);
GridLayout кажется мне более концептуально правильным, когда вы хотите, чтобы ваша панель занимала весь экран.