Установить размер JPanel
Я программирую приложение, которое работает с компонентами Swing, я заметил одну вещь, по которой я хотел бы объяснить, у меня есть эти классы:
- это перечисление, на котором я создаю экземпляр измерения GUI
public enum GuiDimension < WIDTH(700), HEIGHT(400); private final int value; private GuiDimension(int value) < this.value = value; >public int getValue() < return value; >>
private GamePanel gamePanel = new GamePanel(); public static void main(String[] args) < new MainFrame(); >public MainFrame() < initGameFrame(); >private void initGameFrame() < setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(gamePanel); setResizable(false); setUndecorated(true); pack(); setVisible(true); setLocationRelativeTo(null); >>
public class GamePanel extends JPanel < public GamePanel() < setPreferredSize(new Dimension(GuiDimension.WIDTH.getValue(),GuiDimension.HEIGHT.getValue())); //it makes other stuff that are not of interest for this contest >>
они возвращают целые числа, которые могут быть использованы для других целей, как только они были приняты.
Теперь, если я вставлю это на:
SetSize (new Dimension (GuiDimension.WIDTH.getValue (), GuiDimension.HEIGHT.getValue ()));
SetSize (GuiDimension.WIDTH.getValue (), GuiDimension.HEIGHT.getValue ());
вместо этого, который я вставил в пример
setPreferredSize(new Dimension(GuiDimension.WIDTH.getValue(),GuiDimension.HEIGHT.getValue()));
рамка отображается с неправильным размером, и я не понимаю, почему. Если GuiDimension.WIDTH.getValue () а также GuiDimension.WIDTH.getValue ()) верны для setPreferredSize (. ) ,
почему не то же самое для setSize (int,int) и для setSize(Dimension) ?
при тестировании этого простого кода вы можете это увидеть.
1 ответ
Большинство менеджеров компоновки будут игнорировать вызовы размера компонента, но будут учитывать его предпочитаемый размер, иногда минимальный и максимальный, и так, когда вы вызываете pack() ваш размер изменится на то, что менеджеры по расположению и предпочтительные размеры составляющего компонента считают лучшим размером.
Кстати, в соответствии с Клеопатрой (Жанетт), если вам абсолютно необходимо установить предпочтительный размер компонента, вам лучше переопределить getPreferredSize() чем по телефону setPreferredSize(. ) , Последний может быть отменен путем вызова setPreferredSize(. ) на тот же компонент в другом месте, в то время как первый не может.
Кроме того, в вашем примере кода вы используете WIDTH дважды и, похоже, не используете HEIGHT.
редактировать
У вас был комментарий, который был удален относительно размеров упаковки и компонентов. Мой ответ на это был:
pack() Метод запрашивает, чтобы менеджеры компоновки выполнили компоновку компонентов, а менеджеры компоновки имеют значение здесь — что они смотрят, размер по сравнению с предпочитаемыми размерами. Если вы прочитаете javadoc и учебные пособия для большинства менеджеров макетов, вы увидите, что они больше всего уважают предпочтительные размеры. Некоторые, такие как BoxLayout, также смотрят на максимальный и минимальный размер.
Java задать размер панели
Профиль
Группа: Участник
Сообщений: 32
Регистрация: 31.5.2007
Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005
нет времени думать — нужно писать КОД!
Профиль
Группа: Участник
Сообщений: 173
Регистрация: 10.5.2006
Где: Винница,Украина | | Реал
Код |
//Предположительно есть класс public class List_panel extends JPanel public Dimension getPreferredSize() /** Возвратим размер */ return new Dimension(100, 0); > > //В класе фрейма пишем List_panel list = new List_panel(); //делаем Layout , и по вкусу добавим. Предположительно всунем панельку влево: getContentPane().setLayout(new BorderLayout()); getContentPane().add(list, BorderLayout.WEST); |
Профиль
Группа: Участник
Сообщений: 32
Регистрация: 23.5.2007
Код |
JPanel pv = new JPanel(); pv.setLayout(new BoxLayout(pv,BoxLayout.Y_AXIS)); pv.setPreferredSize(new Dimension(100,10)); pv.setMinimumSize(new Dimension(50,10)); pv.setMaximumSize(new Dimension(200,10)); |
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.12.2007
- Прежде, чем задать вопрос, прочтите это!
- Книги по Java собираются здесь.
- Документация и ресурсы по Java находятся здесь.
- Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс «транслит«, если у Вас нет русских шрифтов.
- Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка «Пометить как решённый» находится над первым постом.
- Действия модераторов можно обсудить здесь.
- FAQ раздела лежит здесь.
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Апплеты | Следующая тема » |
Как изменить размер JPanel
если у вас есть достаточно времени и терпения . один из подходов заключается в том, что вы используете абсолютный макет (для очень маленького проекта . ) . у вас больше времени . но вы можете расположить каждый компонент в абсолютном положении и размер, который вы хотите . 🙂
2 ответа
Вы устанавливаете макет для кадра в GridLayout в котором все компоненты имеют одинаковый размер. У вас есть две строки, add(panel) добавляет панель в первую строку сетки. Вторая строка остается пустой. См. Раздел Использование GridLayout.
Комментировать setLayout(new GridLayout(2,1,1,1)); и дополнительное пространство должно исчезнуть. Когда вы прокомментируете эту строку, макет панели содержимого кадра будет BorderLayout . По умолчанию JFrame является BorderLayout . Так что add(panel); добавит панель в центр области содержимого фрейма. В результате панель должна занимать все свободное место.
В качестве побочного примечания избегайте setPreferredSize() , как правило, это необязательно, см. setPreferredSize() Следует ли мне избегать использования методов размера (Предпочтительный | Максимальный размер | Минимум) в Java Swing» для получения дополнительной информации.
Вы можете указать количество строк и столбцов для текстовой области и обернуть ее в панели прокрутки, то есть:
textArea = new JTextArea(5, 20); JScrollPane scrollPane = new JScrollPane(textArea);
EDIT: пример getPreferredSize()
import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.*; public class Ex1 extends JPanel < private JTextArea textarea = new JTextArea (); private JTextField field = new JTextField (); private JButton buton = new JButton ("Trimite"); public Ex1() < setLayout(new BorderLayout()); JPanel panel1 = new JPanel (new BorderLayout(2,2)); JPanel panel2 = new JPanel (new BorderLayout(2,2)); JLabel label1 = new JLabel ("Mesaje"); JLabel label2 = new JLabel ("Scrieti un mesaj"); panel1.add(label1, BorderLayout.NORTH); panel1.add(new JScrollPane(textarea), BorderLayout.CENTER); panel2.add(label2, BorderLayout.WEST); panel2.add(field, BorderLayout.CENTER); panel2.add(buton, BorderLayout.EAST); add(panel1, BorderLayout.CENTER); add(panel2, BorderLayout.SOUTH); >@Override public Dimension getPreferredSize() < return new Dimension(350, 300); >public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationByPlatform(true); Ex1 panel = new Ex1(); frame.add(panel); frame.pack(); frame.setVisible(true); >>); > >
Установить размер jpanel на JFrame явно
У меня JPanel с границей, проблема в том, что когда я добавляю панель в JFrame , она принимает размер панели, хотя я устанавливаю предпочтительный размер для панели с помощью setPreferredSize . Макет кадра – “BoxLayout”, а здесь код:
public class ActionForm extends JFrame < JPanel namePanel; JPanel descPanel; JLabel actionName; JLabel nameLabel; JTextField nameTextField, descTextField; FlowLayout toolBarLayout = new FlowLayout(); public ActionForm() < this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)); TitledBorder nameBorder= BorderFactory.createTitledBorder( "Change Description"); nameBorder.setTitleJustification(TitledBorder.LEFT); namePanel = new JPanel(toolBarLayout); namePanel.setPreferredSize(new Dimension(150, 150)); nameLabel = new JLabel("ButtonName"); nameTextField = new JTextField("Action Name", 50); namePanel.add(nameLabel); namePanel.add(nameTextField); namePanel.setBorder(nameBorder); namePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); this.add(namePanel); >public static void main(String[] args) < ActionForm form = new ActionForm(); form.setVisible(true); form.setSize(970, 500); form.setResizable(false); >>
Почему размер панели не изменяется?
- BoxLayout , принимающий Min/Max/preferredSize , который пришел из JComponents , установленный этим LayoutManager
- (Я не хочу комментировать что-то, потому что мой ответ будет таким длинным), пожалуйста, чтобы сравнить ваш код с этим примером кода, реализованы все хорошие (обязательные и важные) Swing rulles
import java.awt.ComponentOrientation; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.TitledBorder; public class ActionForm < private static final long serialVersionUID = 1L; private JFrame frame; private JPanel namePanel; private JLabel nameLabel; private JTextField nameTextField; private FlowLayout toolBarLayout = new FlowLayout(); public ActionForm() < TitledBorder nameBorder = BorderFactory.createTitledBorder( "Change Description"); nameBorder.setTitleJustification(TitledBorder.LEFT); namePanel = new JPanel(toolBarLayout); namePanel.setPreferredSize(new Dimension(150, 150));// hardCoded sizing namePanel.setMaximumSize(new Dimension(250, 150)); // hardCoded sizing namePanel.setMinimumSize(new Dimension(150, 150)); // hardCoded sizing nameLabel = new JLabel("ButtonName"); nameTextField = new JTextField("Action Name", 10); namePanel.add(nameLabel); namePanel.add(nameTextField); namePanel.setBorder(nameBorder); namePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); frame = new JFrame("Mix / Max / PreferredSize for BoxLayout"); frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); // otherwise nice exceptions java.awt.AWTError: // BoxLayout can't be shared frame.add(namePanel); frame.setPreferredSize(new Dimension(970, 500)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.pack(); frame.setVisible(true); >public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < @Override public void run() < ActionForm form = new ActionForm(); >>); > >
Русские Блоги
JPanel панель ширины / высоты или адаптивная к изображениям панель прокрутки JScrollPane в Java Swing
Я столкнулся с этой проблемой недавно в процессе разработки небольшого приложения. Я искал в Интернете и обнаружил, что был только один пост, и не было никакого решения (депрессия ~~~). Поэтому я попытался найти его по подсказке в Интернете и получил следующее решение (иногда оно сообщит об ошибке). Если у вас есть лучший способ, я надеюсь, что вы можете посоветовать мне ~
Описание проблемы:Добавьте JPanel в JScrollPane. После того как окно уменьшено в размере и изменено, в JScrollPane появляется полоса прокрутки. Если отображается только одна полоса прокрутки, в дополнение к установке HorizontalScrollBarPolicy в javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER или в VerticalScrollBarPolicy в javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, необходимо написать следующий код.
Идеи:По умолчанию после изменения размера окна каждый компонент автоматически завершает компоновку в соответствии с различными менеджерами компоновки, и свойство it играет важную роль для it-PreferredSize (то есть: setPreferredSize (null)). Просто установите связанные события setPreferredSize для указанного компонента при изменении формы, чтобы добиться адаптации.
Операция (например, адаптивная ширина)
private javax.swing.JScrollPane jsp = new javax.swing.JScrollPane(); private javax.swing.JPanel panel = new javax.swing.JPanel(); private float dval; // Исходное соотношение сторон, когда размер панели не изменился jsp.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); jsp.setViewportView(panel); jsp.addComponentListener(new java.awt.event.ComponentAdapter() < public void componentResized(java.awt.event.ComponentEvent evt) < Dimension dim = new Dimension(jsp.getSize().width -jsp.getVerticalScrollBar().getWidth(), // Вертикальная полоса прокрутки может появиться после изменения размера, вам нужно вычесть ее ширину (int)(jsp.getSize().width*dval)); panel.setPreferredSize(dim); // Без установки этого свойства пользовательский интерфейс будет автоматически рассчитывать и устанавливать panel.updateUI(); > >);
На этом этапе панель JPanel реализует адаптивную функцию панели прокрутки JScrollPane.
Однако, если компонент в JPanel содержит изображение, может случиться так, что размер изображения не может измениться при изменении размера контейнера.
2. Добавьте событие componentResized для JPanel
Следующая операция основана на шаге 1
private JButton bt = new JButton(«Кнопка», new ImageIcon("./bt.png")); panel.add(bt); panel.addComponentListener(new java.awt.event.ComponentAdapter() < public void componentResized(java.awt.event.ComponentEvent evt) < // Рекомендуется использовать поток синхронизации для предотвращения проблем синхронизации и зависания интерфейса при изменении размера new Thread(new Runnable() < @Override public void run() < resizeButtonIcon(); >private synchronized void resizeButtonIcon()< // Сбросить размер иконки кнопки в соответствии с размером кнопки bt.setIcon(new ImageIcon(new ImageIcon("./bt.png").getImage().getScaledInstance( // Если значок кнопки получен и сброшен, эффект отображения значка не хорош (int)(bt.getWidth()*0.85), (int)(bt.getHeight()*0.65), Image.SCALE_DEFAULT))); >); panel.updateUI(); > >).start(); > >);
Renderings
Перед изменением (первое изображение справа от первой строки не может нормально отображаться после увеличения и уменьшения, его необходимо растянуть для отображения, а эффект отображения слишком велик):
После модификации (каждое изображение изменяется в соответствии с коэффициентом масштабирования):