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()메소드는 후에 버전정보를 보여주는 다이얼로그를 구현하는 메소드 입니다. 

반응형