language/java
[Java/AWT] Panel 사용하여 다양한 레이아웃 구현하기 / BorderLayout, GridLayout, FlowLayout
zincah
2022. 1. 4. 23:35
반응형
위와 같은 화면의 레이아웃을 만들기 위해서는 여러개의 Panel이 필요합니다.
전체 레이아웃에 패널들을 추가 시키면서 패널안에 원하는 형태의 레이아웃을 넣어준다는 식으로 생각하면 편할 것 같습니다.
위의 화면을 만들기 위해서 다음과 같은 LayoutManager를 활용했습니다.
1. BorderLayout
2. FlowLayout
3. GridLayout
Border Layout
- 기능 : container 영역을 동, 서, 남, 북 그리고 중앙으로 분할
- component의 위치와 크기 설정
- container.add("위치", component);
- 위치 = "East", "West", "South", "North", "Center"
지정되지 않은 영역이 존재할 경우에는 밑의 사진처럼 나타내지기도 합니다. 크기에 맞게 적절한 비율로 영역이 설정된다고 생각하면 될 거 같습니다.
Grid Layout
- 기능 : component가 동일한 크기의 행,렬로 grid를 형성하고, 각 grid에 하나씩의 component를 할당
- 설정방법 : container.setLayout(new GridLayout(r, c));
- component의 위치와 크기 설정
- 동일한 크기로 grid를 형성하고, add한 순서대로 각 component가 배치
- row가 우선 적용
Flow Layout
- 기능 : 설정되는 component의 등록순서대로 , 각 component의 최소크기 대로 순서대로 배치
- 설정방법 : container.setLayout(new FlowLayout());
- component의 위치와 크기 설정
- 각 component의 최소크기는 각 component의 표시내용을 보여줄 수 있는 최소 크기로 설정됨
그림에서 윗부분이 FlowLayout으로 버튼을 추가했을 때이고 그 밑이 GridLayout으로 버튼을 추가했을 때 입니다.
GridLayout으로 추가하면 각 영역을 꽉 채우게 추가가 되는 반면에 FlowLayout은 각 component의 최소 크기로 추가되는 것을 알 수 있습니다.
따라서 제가 만들고자 하는 이미지의 layout을 구현해보면
대충 위와 같은 이미지로 구현해야 하고 보기만해도 많은 패널들이 포함되어야 한다는 것을 알 수 있습니다.
코드
package zinc.java.pro01;
import java.awt.*;
import java.awt.event.*;
public class TodoList extends Frame
implements ActionListener, FocusListener, WindowListener, ItemListener{
private static final long serialVersionUID = 1L;
// 화면 구현 요소
// date
private Choice month = new Choice();
private String[] mstr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"};
private Choice day = new Choice();
private TextField date = new TextField(30);
private TextField sub = new TextField(30);
// todo list
private TextField to1 = new TextField(20);
private TextField to2 = new TextField(20);
private TextField to3 = new TextField(20);
private TextField to4 = new TextField(20);
private TextField to5 = new TextField(20);
// plan
private TextField pl1 = new TextField(25);
private TextField pl2 = new TextField(25);
private TextField pl3 = new TextField(25);
private TextField pl4 = new TextField(25);
private TextField pl5 = new TextField(25);
// memo
private TextArea memo = new TextArea();
// button
private Button bt1 = new Button("setting");
private Button bt2 = new Button("Pause");
private Button bt3 = new Button("reset");
// 메뉴 바
private MenuBar bar = new MenuBar();
private Menu file = new Menu("File");
private MenuItem fnew = new MenuItem("new file");
private MenuItem fopen = new MenuItem("open file");
private MenuItem fsave = new MenuItem("save file");
private MenuItem fsaveas = new MenuItem("save as file");
private MenuItem fexit = new MenuItem("exit");
private Menu help = new Menu("Help");
private MenuItem impo = new MenuItem("version information");
// 파일
FileDialog fdopen = new FileDialog(this, "open file..", FileDialog.LOAD);
FileDialog fdsave = new FileDialog(this, "save file..", FileDialog.SAVE);
// 모달
private Dialog d = new Dialog(this, "Version Information", false);
private Button check = new Button("check");
// 생성자
public TodoList() {
super("new plan");
setMenu();
setBody();
setEvent();
setInpoDialog();
}
public static void main(String[] args) {
new TodoList();
}
public void setMenu() {
setMenuBar(bar);
bar.add(file);
file.add(fnew);
file.addSeparator();
file.add(fopen);
file.add(fsave);
file.add(fsaveas);
file.addSeparator();
file.add(fexit);
bar.add(help);
help.add(impo);
}
public void setBody() {
Color back = new Color(0x756E74);
setBackground(back);
setLayout(new BorderLayout());
add("North", new Label());
add("South", new Label());
add("West", new Label());
add("East", new Label());
// 테두리 여백
Panel mainPanel = new Panel(new BorderLayout(3,3));
Panel titlePanel = new Panel(new BorderLayout(5,5));
Label name = new Label("My Plan...");
name.setFont(new Font("consolas", Font.BOLD, 20));
titlePanel.add("North", name);
Panel titleName = new Panel(new GridLayout(2,1,5,5));
titleName.add(new Label("Date : ", Label.LEFT));
titleName.add(new Label("Subject : ", Label.LEFT));
titlePanel.add("West", titleName);
Panel titleBlank = new Panel(new GridLayout(2,1,5,5));
Panel blank1 = new Panel(new FlowLayout(FlowLayout.LEFT));
blank1.add(date);
titleBlank.add(blank1);
Panel blank2 = new Panel(new FlowLayout(FlowLayout.LEFT));
blank2.add(sub);
titleBlank.add(blank2);
titlePanel.add("Center", titleBlank);
Panel choDate = new Panel(new GridLayout(3,1,3,3));
choDate.add(new Label("Set Date", Label.CENTER));
for(String mon : mstr) month.add(mon + "월");
choDate.add(month);
for(int i=1; i<=31; i++) {
day.add(String.valueOf(i) + "일");
}
choDate.add(day);
titlePanel.add("East", choDate);
mainPanel.add("North", titlePanel);
Panel centerPanel = new Panel(new BorderLayout());
centerPanel.add("North",
new Label("-------------------------------------", Label.CENTER));
Panel todoList = new Panel(new GridLayout(6,1,3,3));
todoList.add(new Label("To Do List"));
Panel todo1 = new Panel(new FlowLayout(FlowLayout.LEFT));
todo1.add(new Checkbox(""));
todo1.add(to1);
todoList.add(todo1);
Panel todo2 = new Panel(new FlowLayout(FlowLayout.LEFT));
todo2.add(new Checkbox(""));
todo2.add(to2);
todoList.add(todo2);
Panel todo3 = new Panel(new FlowLayout(FlowLayout.LEFT));
todo3.add(new Checkbox(""));
todo3.add(to3);
todoList.add(todo3);
Panel todo4 = new Panel(new FlowLayout(FlowLayout.LEFT));
todo4.add(new Checkbox(""));
todo4.add(to4);
todoList.add(todo4);
Panel todo5 = new Panel(new FlowLayout(FlowLayout.LEFT));
todo5.add(new Checkbox(""));
todo5.add(to5);
todoList.add(todo5);
centerPanel.add("Center", todoList);
mainPanel.add(centerPanel);
Panel planList = new Panel(new GridLayout(6,1,3,3));
planList.add(new Label("Planing.."));
planList.add(pl1);
planList.add(pl2);
planList.add(pl3);
planList.add(pl4);
planList.add(pl5);
centerPanel.add("East", planList);
mainPanel.add(centerPanel);
Panel memoPanel = new Panel(new BorderLayout(3,3));
memoPanel.add("North", new Label("My Memo :)", Label.CENTER));
memoPanel.add("Center", memo);
Panel button = new Panel(new GridLayout(1, 3, 5, 5));
button.add(bt1);
button.add(bt2);
button.add(bt3);
memoPanel.add("South", button);
mainPanel.add("South", memoPanel);
add("Center", mainPanel);
setSize(500, 600);
setResizable(false);
// 화면 중앙 메소드
Dimension sc = Toolkit.getDefaultToolkit().getScreenSize();
Dimension my = getSize();
setLocation(sc.width/2 - my.width/2, sc.height/2 - my.height/2);
setVisible(true);
}
// 버전 정보 다이얼로그
public void setInpoDialog() {
d.setLayout(new BorderLayout(3,3));
d.add("North", new Label("Version Information", Label.CENTER));
d.add("Center", new Label("Todo List.v.1.0 by zincah", Label.CENTER));
d.setSize(260, 130);
Dimension dialog = d.getSize();
int x = getX() + (getWidth()/2 - dialog.width/2);
int y = getY() + (getHeight()/2 - dialog.height/2);
d.setBounds(x, y, 260, 130);
d.setResizable(false);
//d.setVisible(true);
}
public void setEvent() {
addWindowListener(this);
}
@Override
public void windowOpened(WindowEvent e) {}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {}
@Override
public void windowIconified(WindowEvent e) {}
@Override
public void windowDeiconified(WindowEvent e) {}
@Override
public void windowActivated(WindowEvent e) {}
@Override
public void windowDeactivated(WindowEvent e) {}
@Override
public void focusGained(FocusEvent e) {}
@Override
public void focusLost(FocusEvent e) {}
@Override
public void actionPerformed(ActionEvent e) {}
@Override
public void itemStateChanged(ItemEvent e) {}
}
- setBody() 메소드 부분이 화면 구현을 담당합니다.
- 밑에 override되어있는 부분은 후에 이벤트를 추가하기 위해 작성해 놓은 것 입니다.
* setMenu() 메소드는 메뉴바를 구현하는 메소드이고 setInfoDialog()메소드는 후에 버전정보를 보여주는 다이얼로그를 구현하는 메소드 입니다.
반응형