AWT나 SWING 컴포넌트를 사용하면서 지금까지 거의 setBounds로 위치를 직접 지정해줬다. 정확하게 하는 것은 좋은데 위치나 크기를 매번 직접 계산을 해야한다는 것이 일이다. 컴퓨팅의 세계에서는 자동화 할 수 있는 모든 것은 바꿔야한다. for나 while 루프가 강력한 이유와 같다. 자동화를 시키면 100번이 아니라 100억번도 똑같은 작업을 반복한다.

 

 

레이아웃 매니저를 사용하면 마치 최근의 반응형 웹페이지 같이 윈도우 창의 상태에 따라 알아서 컴포턴트의 형태를 변형하고 다시 그려준다. Swing이 2000년대 초반에 나왔다는 것을 감안하면, 2010년대 중반에 떠오른 반응형 웹페이지라는 것도 완전히 새로운 개념은 아니었다. 시대의 필요에 의해 과거 이미 존재하던 기술들이 각광을 받는 것이다.

 

 

새로운 것이라 생각하는 많은 것들이 사실은 이미 오래전에 존재해왔다는 사실이 놀랍다. 그것은 누군가 앞서 갔다는 말이다. 앞서 있었지만 굳이 티내지 않았다고 생각한다. 이 세상이 물질주의가 당연시하는 것을 하지 않는 사람도 있다. 아니면 시대에 맞지 않아서 그렇거나... 빡빡하게 생각할 것은 없다. 모든 기술자가 돈에 미쳐있지는 않았다고 믿는다 ㅎ 물론 돈을 좋아하겠지만,

 

LayoutManager가 하는 일은 확실히 알수 있다. setBounds로 x와 y의 위치와 너비와 높이를 신경쓰지 않게 해주는 것이다. Swing에서 사용할 수 있는 10가지 정도의 레이아웃이 있다.

 

1. BorderLayout

 

레이아웃은 백문이 불여 일견이다.

 

다섯개의 기본 배치

 

유저가 창크기를 변경하면 따라 변한다

동서남북과 가운데를 배치한다. JFrame에 add 할 시에 5개의 컴포넌트의 위치를 넘겨주면 된다. 위치는 BorderLayout의 상수다. 

 

* setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

기존 예제에는 없었는데 앞으로 JFrame을 열고 닫을때는 항상 넣어주도록한다. 이게 없어도 윈도우창이 종료는 된다. 그러나 이 문장이 없으면 윈도우창을 종료해도 메모리에 남아있다. 이클립스도 자체적 관리는 하는 것으로 보이는데 완벽하지 않다. 이 문장없이 Swing으로 여러개의 창을 실행시키다 보면 사용못하는 메모리가 늘어나서 프로그램이 충돌이 될 수 있다. Java는 GC (가비지 콜렉터, 쓰레기 수거반) 가 알아서 해준다고 하지만 완벽하지는 않다. 역시 제일 확실한 것은 프로그래머가 예상하여 메모리를 해제하는 것이다. C정도는 아니지만 많은 경우 직접 메모리를 해제할 방법은 있다. JFrame의 setDefaultCloseOpertaion 과 같은 함수를 호출하는 것이다.

 

import java.awt.BorderLayout;
import javax.swing.*;

public class SwingEX7 extends JFrame{

	private static final long serialVersionUID = 1L;
	SwingEX7(){	
		
		JButton bt1 = new JButton("NORTH");
		JButton bt2 = new JButton("SOUTH");
		JButton bt3 = new JButton("EAST");
		JButton bt4 = new JButton("WEST");
		JButton bt5 = new JButton("CENTER");
				
		add(bt1,BorderLayout.NORTH);
		add(bt2,BorderLayout.SOUTH);
		add(bt3,BorderLayout.EAST);
		add(bt4,BorderLayout.WEST);
		add(bt5,BorderLayout.CENTER);
				
		setTitle("Java Swing EX");
		setSize(400,200);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new SwingEX7();
	}
}

BorderLayout은 말그대로 border(경계선)을 기점으로 만들어진다.

 

2. GridLayout (격자)

그리드레이아웃은 바둑판 같은 것이다. 1x 8, 2x4 ,3x3, 이런 식으로 가능하다.

 

1 x 8 그리드레이아웃

 

4 x 2 그리드레이아웃
옆으로 길게 잡아당김(반응형)

import java.awt.*;
import javax.swing.*;

public class SwingEX8 extends JFrame{
	
	SwingEX8(){	
		
		JButton bt1 = new JButton("A");
		JButton bt2 = new JButton("B");
		JButton bt3 = new JButton("C");
		JButton bt4 = new JButton("D");
		JButton bt5 = new JButton("E");
		JButton bt6 = new JButton("F");
		JButton bt7 = new JButton("G");
		JButton bt8 = new JButton("H");
				
		add(bt1);add(bt2);
		add(bt3);add(bt4);
		add(bt5);add(bt6);
		add(bt7);add(bt8);
				
		setTitle("Java Swing EX");
		setSize(400,200);
		setVisible(true);
		setLayout(new GridLayout(4,2));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new SwingEX8();
	}
}

JFrame 에 add한 순서대로 들어가는 것을 볼 수있다. GridLayout은 간단한 배치에 사용하고 비슷하면서 다양한 형태를 만들 수 있는 GridBagLayout 있다.

 

new GridLayout(4,2)는 4 x 2의 그리드를 만들어서 LayoutManager를 반환한다.

 

3. BoxLayout

 

박스를 쌓는 모양의 레이아웃이다. AWT에서 사용된 레이아웃메니저인데 Swing의 JFrame에는 그다지 호환성이 낮다. 스택오플에 보면 JFrame에 걸지말고 getContentPane()에서 레이아웃을 설정하라는데 굳이 다른 레이아웃 매니저로도 가능한 것으로 보인다. JFrame으로도 실행이 되는 것은 확인해봤으나 필자의 환경에서는 제대로된 레이아웃이 나오지 않았다.

 

 

error upon assigning Layout: BoxLayout can't be shared

I have this Java JFrame class, in which I want to use a boxlayout, but I get an error saying java.awt.AWTError: BoxLayout can't be shared. I've seen others with this problem, but they solved it by

stackoverflow.com

import java.awt.*;
import javax.swing.*;

public class SwingEX9 extends Frame{

Button[] bt;
Panel jp1;
	
	SwingEX9(){	
		
		jp1 = new Panel();
		jp1.setLayout(new BoxLayout(jp1,BoxLayout.Y_AXIS));
	
		bt = new Button[7];

		for(int i=0; i<7; i++) {
			bt[i] = new Button("BUTTON "+(i+1));
			jp1.add(bt[i]);
		}
		
		add(jp1);
		setTitle("Java Swing EX");
		setSize(400,400);
		setVisible(true);
		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new SwingEX9();
	}
}

AWT 박스레이아웃

 

코드를 보면 AWT 코드를 사용하고 있다. 프레임이 아니라 패널에 붙였다. 그리고 버튼도 배열로 만들었다. 하나씩 만들다 보면 코드도 길어지고 응용력이 떨어지니까.  JButton 클래스를 객체 배열로 만들어서 지정한 숫자만큼 생성할 수 있다.

 

4. FlowLayout

플로우레이아웃이다. 플로우, 컴포넌트들이 흐름을 따라가는 것 처럼 보인다. 아래 그림과 같이 창의 크기에 따라 알아서 자기들 위치를 잡는다. 플로우 레이아웃 상수 (LEFT, RIGHT, CENTER 등) 을 기준으로 자동 정렬하는 방식이다.

 

 

import java.awt.*;
import javax.swing.*;

public class SwingEX10 extends JFrame{
	
	JButton[] bt;
	
	SwingEX10(){	
		
		bt = new JButton[100];

		for(int i=0; i<bt.length; i++) {
			bt[i] = new JButton("BTN"+ i);
			add(bt[i]);
		}
		
		setTitle("Java Swing EX");
		setSize(300,300);
		setVisible(true);
		setLayout(new FlowLayout(FlowLayout.RIGHT));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new SwingEX10();
	}
}

 

5. 카드레이아웃

 

레이아웃이 카드처럼 생겼다고 해서 카드레이아웃이다. 윈도우창과의 여백을 설정할 수 있다.

 

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class SwingEX11 extends JFrame implements ActionListener{
	
JButton[] bt;
Container ct;
CardLayout cl;
	
	SwingEX11(){	
		
		ct = getContentPane(); // 컨테이너 리턴(루트페인)
		cl = new CardLayout(100,30);
		ct.setLayout(cl);
		
		bt = new JButton[50];

		for(int i=0; i<bt.length; i++) {
			bt[i] = new JButton("BUTTON "+(i+1));
			bt[i].addActionListener(this);
			ct.add(bt[i]);
		}
	}
	public static void main(String[] args) {
		SwingEX11 i1 = new SwingEX11();
		
		i1.setTitle("Java Swing EX");
		i1.setSize(400,400);
		i1.setVisible(true);
		i1.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		cl.next(ct);
	}
}

 

JFrame은 컨테이너페인의 인스턴스를 가져와서 Container (상위클래스)에 참조한다. CardLayout에는 100의 수평여백과 30의 수직여백을 설정한다. 컨테이너에게 카드레이아웃을 전달하기만 하면 사용할 수 있다. 액션리스너는 버튼의 수만큼 설정해준다. 이벤트 처리기에는 클릭했을 때 다음으로 넘어가게 해준다. cl.next(ct) 이벤트핸들링이 되야 다음 카드(버튼)으로 넘어가기 때문에 기본적으로 버튼과 함께 사용한다. 작았을때는 버튼, 커지니까 카드가 된다.

 

다음 포스트에서 GridBagLayout 등 나머지 레이아웃을 다룰 것이다.

 

 

*잡담

 

 인터넷에 자바나 Swing에 관련한 많은 포스트가 있다. 이 포스트도 그 중에 하나일 뿐이지만 영문,한글 등 수많은 문서가 있다. 사실 인터넷에는 영문과 한글만 있는게 아니라 수많은 자기 나라의 말로 번역이 되어 있다. 정보의 바다에서 헤엄을 못쳐서 그런 것 뿐이다.

 

예를들어서 일본인들의 웹사이트에서 Swing을 가르쳐주는 곳도 있다. 아래는 일본어 Swing 입문으로 구글의 상위 검색내용이다. 내용을 보면 굉장히 충실하다. 뭐랄까 영어자료는 방대하고 여러곳에 퍼져있는 느낌이라면 일본은 자료가 그정도로 많지 않지만 설명이 친절한 편이다. 읽을게 많다, 정보의 홍수같은 시대에 100프로 좋다할 순 없지만. 하나의 사물을 바라보는데 어떤 민족성이란 것도 무시할 수 없다. Java 는 객체 지향 프로그래밍이지만 우리가 Java를 봤을 때도 하나의 객체에 지나지 않는다. 어떤 나라 사람이 Java를 가지고 뭘하건 그건 그들의 사정일 뿐이다. 그들의 사정을 이해하고 존중해줄 필요는 있지만 소위 말하는 '빠'가 될 필요는 없다고 본다. (빠는 어떤 한방향의 사실이나 주장,사람 등을 맹목적으로 추종하여 동의하지 않는 상대방은 철저히 비난하고 배제하는 그룹을 세간에서 말할때 쓰인다)

 

 

Swing入門

 

wisdom.sakura.ne.jp

 

 

作って学ぼう!0から始めるJavaプログラミング入門①

プログラミングについて勉強し始めたけど、いったい何から始めたらよいかわからない人も多いと思います。そこで今回は入門編としてJavaを用いた簡単なアプリを作る手順をご紹介します。

www.geekjob.jp

 

 

Swingを使ってみよう

Java を使ってグラフィカルなコンポーネントを使ったアプリケーションを開発する為に、 Java では Swing が用意されています。ここでは Swing の各コンポーネントの使い方を順にサンプルを作り

www.javadrive.jp

가끔 이런 블로그에 시대가 지나가는 기술들의 튜토리얼들이나 올리고 있다는게 의미가 있냐는 생각을 한다. 코드를 포스팅하다 보면 다른 이들의 포스팅도 많이 참고하게 된다. 다들 열심히 사는것 같이 보이는데 꾸준히 종합적으로 올리는 사람들도 별로 없다는 생각이 들었다. 여러가지 이유가 있었겠지만 그냥 별로 재미없어서, 동기가 떨어져서 일수도 있겠고... 별로 보상이 없어서 그럴 수도 있겠다는 생각도 든다. Java라는 언어의 한계라기 보다 한글을 사용하며 Java를 사용하는 사람들의 숫자 문제일 수도 있다.

 

영어권 매달 250만명의 유저가 사용하는 Programiz 같은 경우는 CEO가 동남아시아 계열로 보인다. (의외로 영어로 프로필을 찾기가 쉽지 않다.) 영어권 사용자들을 위한 온라인 프로그래밍 튜토리얼 사이트다. 방글라데시 등 동남아시아에서 많이 보는 것으로 나와있고 미국과 유럽에서도 30%이상 트래픽이 유입된다고 한다.

 

월 250만명이란 수치는 굉장한 수치다. 우리나라에서 월 100만명의 순유입이있는 사이트면 수백억의 가치를 지닌 비즈니스다.

 

막상 웹사이트에 가보면 별거 아니라는 생각이 들 수 있다. 그냥 튜토리얼 사이트니까. 영어가 아니었다면 어려웠을지도 모르고, 동남아시아 사람들이 영어를 사용하는 사람들 비율이 높기 때문에 그런 트래픽이 유지가 될 수 있는 것이다. 영어를 쓰는 자국민이라는 것도 있다. 영어를 사용하는 우리 나라 사람의 홈페이지에 들어간다는 말이다.

 

결국 점점 더 영어를 모르고는 살아남을 수 없는 세상으로 가고 있다. 이과건 문과건 똑같다고 본다.

 

불과 몇년전과 비교해보면 많은게 바뀌었다. 전염병의 시대라서 사람의 교류가 뜸해질지라도 정보의 교류는 더욱 가속화 할 것이다. 필자는 일본어를 조금 할 줄 알고 영어도 조금 할 줄 안다. 프로처럼 일할 수준까지는 아닐 것 같은데 웹상에서 내가 원하는 정보를 찾아내서 사용하는 것 까지는 가능하다. 필요하면 현지에 직접 전화거는 정도의 수고도 가능하다. 예전엔 그저 해외여행갈때나 조금 쓸모있다고 생각했는데, 지금은 바뀌었다.

 

그런 정보의 습득능력이야 말로 가장 중요한 부분이다.

 

프로그래밍 같은 경우도 영어 강의가 많기 때문에 훨씬 유리하다. 요새도 아무생각없이 그냥 코딩만 하는 사람들은 별로 없을 것이다. 적어도 새로운 기술에 대한 생각이나 방향성은 있어야 된다고 생각한다.

 

물론 힘들겠지만 세상이 바뀐다면 거기에 맞춰나가야 한다. 어쨋든 내가 안바뀌어도 세상은 바뀐다.

 

https://www.programiz.com/

 

Programiz: Learn to Code for Free

Choose what to learn Start learning popular programming languages.

www.programiz.com

 

프로그라미즈 CEO 관련 인터뷰

 

How to get started in web development with Python - Open Source For You

If you are thinking of building a complex full-fetched web application in Python from scratch, you might be doing it wrong.

www.opensourceforu.com

 

 

*자바 오라클 공식문서 레이아웃 메니저 제일 자세하게 나와있으나 좀 어려울 수도 있다.

https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

 

A Visual Guide to Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Compon

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See JDK Release Notes for information about new fe

docs.oracle.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band