Автоматическое изменение размеров компонентов на фрейме при его изменении - Java
Формулировка задачи:
Добрый день.
Создаю JFrame, добавляю на него JPanel, на JPanel добавляю JTextArea и JButton.
Для JPanel используется BorderLayout. Помещаю ее в область South.
Для JPanel используется FlowLayout manager, дабы JTextArea и JButton располагались в линию слева направо.
Для JText Area заданы размеры, так что JTextArea и JButton заполняют всю область фрейма(изначально).
Вопрос
: Как сделать, чтобы JTextArea при изменении размера JFrame автоматически изменяла свои размеры, растягиваясь вместе с фреймом? Кнопка при этом не увеличивалась. Вроде как BorderLayout автоматом все это дело растягивает, но как быть с другими менеджерами, ведь при размещении на панели я использую. к примеру, FlowLayout.
вопрос актуален.
Задам его по другому:
Какие средства существуют в Java для растяжения компонентов размещенных во фрейме в зависимости от изменения его размеров?
Решение задачи: «Автоматическое изменение размеров компонентов на фрейме при его изменении»
textual
Листинг программы
import java.awt.*;
import java.awt.Color.*;
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.Scanner;
//создаем графический интерфейс программы
public class ChatClientGui {
private JButton disconnectButton;
private JFrame mainFrame;
private String[] massivUsers;
private JTextArea chatField;
private JTextArea messageField;
private JList nicknameList;
private JPanel panelEast;
private JPanel panelSouth;
private JPanel panelButton;
private JScrollPane scrollListUsers;
private JScrollPane scrollMessageField;
private JScrollPane scrollChatField;
private JButton sendButton;
class DisconnectButton implements ActionListener{ //внутренний класс для события кнопки выхода
public void actionPerformed(ActionEvent event){
System.out.println("disconect from chat-server"); //заменить на код дисконекта
}
}
class SendButton implements ActionListener{ //внутренний класс для события кнопки отправки сообщения
public void actionPerformed(ActionEvent event){
System.out.println("сообщение отправлено");
}
}
public void buildGui() { //отрисовка интерфейса
mainFrame = new JFrame("Chat4u");
massivUsers = new String[200]; //заменится на коллекцию
nicknameList = new JList(massivUsers);
//panelAnimation = new JPanel();
panelEast = new JPanel();
panelSouth = new JPanel();
panelButton = new JPanel();
disconnectButton = new JButton("disconnect");
disconnectButton.setToolTipText("разсоединиться с сервером");
disconnectButton.setMargin(new Insets(7,18,7,18));
chatField = new JTextArea();
chatField.setLineWrap(true);
chatField.setFocusable(false);
messageField = new JTextArea(2,0); //ширина=0, т.к. поле растягивается по всей свободной ширине
messageField.setLineWrap(true);
messageField.setToolTipText("введите сообщение");
scrollListUsers = new JScrollPane(nicknameList);
scrollMessageField = new JScrollPane(messageField);
scrollMessageField.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollMessageField.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollChatField = new JScrollPane(chatField);
scrollChatField.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollChatField.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
sendButton = new JButton("send");
sendButton.setToolTipText("отправить сообщение");
sendButton.setMargin(new Insets(7,18,7,18));
//построение основного окна(фрейма)
mainFrame.setDefaultLookAndFeelDecorated(true);
mainFrame.add(BorderLayout.EAST,scrollListUsers);
mainFrame.add(BorderLayout.SOUTH,panelSouth);
//mainFrame.add(BorderLayout.WEST,panelAnimation);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //задаем операцию по закрытии фрейма
mainFrame.setSize(1200, 900); //задаем размеры фрейма
mainFrame.setVisible(true); //делаем фрейм видимым
mainFrame.add(BorderLayout.CENTER, scrollChatField);
//построение списка юзеров(восточная панель)
nicknameList.setFixedCellHeight(20); //задаем высоту ячейки листа
nicknameList.setFixedCellWidth(157); //задаем ширину ячейки листа
nicknameList.setAutoscrolls(true); //добавляем автоскрол
nicknameList.setBackground(Color.cyan);
nicknameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //ограничиваем выбор до одного ника в списке
for(int i=0;i<100;i++) //заменится на коллекцию
massivUsers[i] = "User Name";
scrollListUsers.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollListUsers.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
//размещение кнопок(южная панель)
panelButton.setLayout(new BoxLayout(panelButton,0));
panelButton.setBackground(Color.DARK_GRAY);
panelButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
panelButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);
panelButton.add(sendButton);
panelButton.add(disconnectButton);
//построение области ввода текста(южная панель)
panelSouth.setLayout(new BorderLayout());
panelSouth.add(BorderLayout.CENTER,scrollMessageField);
panelSouth.add(BorderLayout.EAST,panelButton);
//построение области анимации
/* panelAnimation.setSize(50, 800);
panelAnimation.setBackground(Color.gray.darker());
panelAnimation.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
panelAnimation.setToolTipText("just 4 fun");
*/
//создание слушателей событий для кнопок
disconnectButton.addActionListener(new DisconnectButton());
sendButton.addActionListener(new SendButton());
}
public void actionPerformed(ActionEvent event){
JButton button2;
disconnectButton.setText("puched");
button2 = new JButton("second button");
panelEast.add(BorderLayout.WEST, button2);
}
public static void main(String[] args){
ChatClientGui chatClientGui = new ChatClientGui();
chatClientGui.buildGui();
}
}