Как установить определенный размер окна (фрейма) в java swing?
«Как установить определенный размер окна (фрейма) в java swing?» Чаще всего вы хотите установить предпочтительный размер области содержимого фрейма или, возможно, компонента на панели содержимого. Предположение о том, насколько велик размер самого фрейма и как организовать или рендерить контент, чревато проблемами.
2 ответа
Ну, вы используете как frame.setSize() , так и frame.pack() .
Вы должны использовать один из них за один раз.
Используя setSize() , вы можете указать размер кадра, но если вы используете pack() , он автоматически изменит размер кадров в соответствии с размером компонентов в нем. Он не будет учитывать размер, который вы упомянули ранее.
Попробуйте удалить frame.pack() из своего кода или поместить его перед настройкой размера, а затем запустите его.
Переместите pack() перед setSize() но не удаляйте его! Вызов pack() (frames) или validate() (applet) необходим для правильного размещения вне GUI. Или, что еще лучше, добавьте некоторое содержимое в фрейм, чтобы менеджеры компоновки могли определить, насколько большим он должен быть при упаковке (и удалить любой вызов, чтобы установить размер, предпочтительный размер, максимальный или (возможно, даже) минимальный размер). -1
Большинство менеджеров макетов лучше всего работают с компонентом preferredSize, и большинство графических интерфейсов лучше всего разрешать компонентам, которые они содержат, устанавливать свои собственные предпочтительные значения на основе их содержимого или свойств. Чтобы использовать эти менеджеры макетов в своих лучших интересах, вызовите pack() на своих контейнерах верхнего уровня, таких как ваши JFrames, прежде чем сделать их видимыми, поскольку это скажет этим менеджерам делать свои действия — для компоновки их компонентов.
Часто, когда мне нужно было играть более прямую роль в настройке размера одного из моих компонентов, я переопределю getPreferredSize и верну его размер, размер которого больше, чем super.preferredSize(или, если не тогда возвращает супер значение).
Например, здесь небольшое приложение drag-a-rectangle, которое я создал для другого вопроса на этом сайте:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MoveRect extends JPanel < private static final int RECT_W = 90; private static final int RECT_H = 70; private static final int PREF_W = 600; private static final int PREF_H = 300; private static final Color DRAW_RECT_COLOR = Color.black; private static final Color DRAG_RECT_COLOR = new Color(180, 200, 255); private Rectangle rect = new Rectangle(25, 25, RECT_W, RECT_H); private boolean dragging = false; private int deltaX = 0; private int deltaY = 0; public MoveRect() < MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); addMouseListener(myMouseAdapter); addMouseMotionListener(myMouseAdapter); >@Override protected void paintComponent(Graphics g) < super.paintComponent(g); if (rect != null) < Color c = dragging ? DRAG_RECT_COLOR : DRAW_RECT_COLOR; g.setColor(c); Graphics2D g2 = (Graphics2D) g; g2.draw(rect); >> @Override public Dimension getPreferredSize() < return new Dimension(PREF_W, PREF_H); >private class MyMouseAdapter extends MouseAdapter < @Override public void mousePressed(MouseEvent e) < Point mousePoint = e.getPoint(); if (rect.contains(mousePoint)) < dragging = true; deltaX = rect.x - mousePoint.x; deltaY = rect.y - mousePoint.y; >> @Override public void mouseReleased(MouseEvent e) < dragging = false; repaint(); >@Override public void mouseDragged(MouseEvent e) < Point p2 = e.getPoint(); if (dragging) < int x = p2.x + deltaX; int y = p2.y + deltaY; rect = new Rectangle(x, y, RECT_W, RECT_H); MoveRect.this.repaint(); >> > private static void createAndShowGui() < MoveRect mainPanel = new MoveRect(); JFrame frame = new JFrame("MoveRect"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); >public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < createAndShowGui(); >>); > >
Обратите внимание, что мой основной класс — JPanel, и что я переопределяю JPanel getPreferredSize:
public class MoveRect extends JPanel < //. deleted constants private static final int PREF_W = 600; private static final int PREF_H = 300; //. deleted fields and constants //. deleted methods and constructors @Override public Dimension getPreferredSize()
Также обратите внимание, что когда я показываю свой графический интерфейс, я помещаю его в JFrame, вызываю pack(); в JFrame, устанавливаю его позицию, а затем вызываю setVisible(true); на моем JFrame:
private static void createAndShowGui() < MoveRect mainPanel = new MoveRect(); JFrame frame = new JFrame("MoveRect"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); >public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < createAndShowGui(); >>); > >
Java Swing: знакомство
Начнём применять изученные приёмы и конструкции языка Java в создании простейших приложений. В этом нам поможет Java Swing, который реализует графический интерфейс пользователя..
Swing в Java — это инструментарий графического интерфейса пользователя (GUI), включающий компоненты GUI.
Swing предоставляет богатый выбор виджетов и пакетов для создания изысканных компонентов GUI для Java-приложений.
Java Swing — структура
Swing является частью Java Foundation Classes (JFC). JFC представляет собой API для программирования GUI на Java, обеспечивающий графический интерфейс пользователя.
Библиотека Java Swing построена поверх Java Abstract Widget Toolkit (AWT). Можно использовать простые компоненты программирования графического интерфейса Java:
из библиотеки, без необходимости создания данных компонентов с нуля.
Для создания графического интерфейса необходим хотя бы один объект-контейнер. Классы-контейнеры – это классы, на которых могут располагаться другие компоненты.
Существует три типа контейнеров Java Swing.
- Панель: Это чистый контейнер, который сам по себе не является окном. Единственная цель панели — разместить компоненты на окне.
- Фрейм (Frame): Это полностью функционирующее окно с заголовком и значками.
- Диалог: Его можно представить как всплывающее окно, которое появляется, когда необходимо отобразить сообщение. Это не полностью функционирующее окно, как фрейм.
Для начала реализуем простейший GUI непосредственно в главном методе main():
import javax.swing.*; // подключаем все средства java Swing public class Program < // класс с методом main() public static void main(String[] args) < JFrame frame = new JFrame("My First GUI"); // Для окна нужна "рама" - Frame // стандартное поведение при закрытии окна - завершение приложения frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); // размеры окна frame.setLocationRelativeTo(null); // окно - в центре экрана JButton button = new JButton("Press"); // Экземпляр класса JButton // getContentPane() - клиентская область окна frame.getContentPane().add(button); // Добавляем кнопку на Frame frame.setVisible(true); // Делаем окно видимым >>
Прежде чем двигаться дальше, разберёмся со структурой (минимальным набором элементов) окна:
Пора протестировать первое приложение. После запуска можно увидеть, что кнопка «Press» заполнила всю клиентскую область окна:
Как это исправить? Для этого служит менеджер компоновки. Он используется для компоновки (или расположения) компонентов GUI Java внутри контейнера. Существует множество менеджеров компоновки, но наиболее часто используемые из них — это BorderLayout, который размещает компоненты в пяти областях:
- cверху (NORTH);
- снизу (SOUTH);
- слева (WEST);
- справа (EAST);
- по центру (CENTER).
Добавим ещё одну кнопку. Теперь их будет две. Первую переименуем в «Старт», а вторую назовём «Стоп»:
import java.awt.BorderLayout; // подключаем BorderLayout import javax.swing.*; // подключаем все средства java Swing public class Program < // класс с методом main() public static void main(String[] args) < JFrame frame = new JFrame("My First GUI"); // добавляем панель JPanel buttonsPanel = new JPanel(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setLocationRelativeTo(null); // окно в центре экрана JButton start = new JButton("Старт"); JButton stop = new JButton("Стоп"); // добавляем кнопки на панель buttonsPanel.add(start); buttonsPanel.add(stop); // размещаем панель на Frame (верхняя часть) frame.getContentPane().add(BorderLayout.NORTH, buttonsPanel); frame.setVisible(true); >>
Теперь две кнопки расположены рядом, в верхней части экрана:
Таким образом можно создавать нужное количество невидимых панелей и размещать (add) на них необходимое число компонентов. Впоследствии «крепить» панели на клиентскую область окна. Это подобно кнопочным панелям, размещённым на корпусе какого либо устройства:
Осталось разобраться с иконкой приложения и запретом (разрешением) изменения размеров окна.
Иконка GUI-приложений на Java Swing
Рассмотрим один из способов установки иконки в левый верхний угол окна приложения. Для начала нужно выбрать файл иконки в PNG-формате. Файл должен иметь одинаковые габариты по ширине и высоте. Желательно, чтобы размеры были кратные 16: 16×16, 32×32, 64×64, 128×128 и т.д. После помещения иконки в одну из папок проекта (в данном случае выше уровнем и в отдельной папке «images»):
При таком расположении файла иконки, код будет следующим:
import java.awt.BorderLayout; import javax.swing.*; // подключаем все средства java Swing public class Program < // Program - "главный" класс с методом main() public static void main(String[] args) < JFrame frame = new JFrame("My First GUI"); // задаём путь к иконке (т.е. где находится файл) String path = "../images/icon.png"; // создание через обращение к главному классу приложения и его ресурсам ImageIcon icon = new ImageIcon(Program.class.getResource(path)); // помещение иконки на frame frame.setIconImage(icon.getImage()); JPanel buttonsPanel = new JPanel(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setLocationRelativeTo(null); JButton start = new JButton("Старт"); JButton stop = new JButton("Стоп"); buttonsPanel.add(start); buttonsPanel.add(stop); frame.getContentPane().add(BorderLayout.NORTH, buttonsPanel); frame.setVisible(true); >>
При запуске, вместо стандартной иконки (чашка с кофе), в левом верхнем углу появится та, которая находится в файле «icon.png» (имя файла иконки может быть и другим — по Вашему усмотрению):
Фиксированный размер окна
При решении ряда задач бывает необходимым отключение возможностей изменения размеров окна приложения. В текущей реализации, при наведении курсора мыши на любой из краёв окна будет появляться двусторонняя стрелка. При нажатии и перемещении любого из краёв, размеры окна будут изменяться:
Чтобы сделать размер окна фиксированным можно вызвать метод контейнера JFrame setResizable():
.setResizable(false);
Эту строчку можно поместить сразу после строки с заданием геометрии окна. Полный код:
import java.awt.BorderLayout; import javax.swing.*; // подключаем все средства java Swing public class Program < // класс с методом main() public static void main(String[] args) < JFrame frame = new JFrame("My First GUI"); // задаём путь к иконке (т.е. где находится файл) String path = "../images/icon.png"; // создание через обращение к главному классу приложения и его ресурсам ImageIcon icon = new ImageIcon(Program.class.getResource(path)); // помещение иконки на frame frame.setIconImage(icon.getImage()); JPanel buttonsPanel = new JPanel(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // задание геометрии окна frame.setSize(300, 300); // запрет изменения размеров frame.setResizable(false); frame.setLocationRelativeTo(null); JButton start = new JButton("Старт"); JButton stop = new JButton("Стоп"); buttonsPanel.add(start); buttonsPanel.add(stop); frame.getContentPane().add(BorderLayout.NORTH, buttonsPanel); frame.setVisible(true); >>
Теперь все элементы, отвечающие за изменение габаритов, стали неактивными:
Размеры окна поменять теперь нельзя. Однако, нажатие на кнопки пока не приводят ни к каким действиям. Реакцию на события рассмотрим в следующий раз.
Фиксированный размер окна JFrame
Здравствуйте. Как установить фиксированный размер окна JFrame? Что бы нельзя было развернуть на весь экран/растянуть?
JFrame размер
Добрый день. Создаю фрейм. Затем узнаю его размер и вывожу его в консоль. Только дело в том, что.
Как установить максимальный размер JFrame
Доброго времени суток, гики. Есть такой код который задает минимальные размеры экрана. .
Вызов окна (Jframe)
Всем привет можете помочь со следующей ситуацией: есть форма с кнопкой при нажатии на кнопку.
Перетаскивание окна JFrame
Всем привет, нужно сделать возможность перетаскивать окно при помощи нарисованного (через.
Сообщение было отмечено Муравей как решение
Решение
Кнопки в JPanel не маштабируются под размер JFrame
Доброго времени суток, в теории вроде как кнопочки должны заполнить весь экран, но не заполняют, и.
Размер ContentPane у JFrame с параметром setResizable (false)
Обнаружил вот такую странность: JFrame mf = new JFrame(); mf.setVisible(true);.
Как задать фон окна JFrame
Как задать фон окна JFrame package окно.входа.в.систему; import java.awt.Color; import.
Подтверждение закрытия окна Jframe по нажатию на кнопку
Привет, всем) нужна помощь! Есть кнопка по нажатию на которую, должен закрыться джфрейм, но.
Открытие другого окна jframe при нажатии на jbutton
вот первое окно хочу чтобы при нажатии на кнопку открывалась другое ,помогите пожалуйста) import.