awt
awt는 해당 운영체제의 특징을 따라 화면 구성을 하게 됨. 따라서 운영체제에 따라 느낌이 다르다.
java.awt.*
(예) Button, Frame, TextField ...
swing
swing은 자바 영역에서 사용하는 look&feel 을 적용 받아 모든 운영체제에서 동일한 느낌을 제공.
javax.swing.*
(예) JButton, JFrame, JTextField ...
화면 구성을 두 가지를 섞어서 할 수 있음.
용어정리
① Container
자바에서 Container는 창의 역할을 한다.
한 개 이상의 Container 위에 Component들이 올려질 영역
Container는 실제로 Component보다 작은 개념이다.
(예) Frame, Window, Panel, Dialog, Applet
② Component
실제로 Container 위에 올려져서 화면 구성을 담당하는 요소들!
(예) Button, TextField, TextArea, List, ...
③ LayoutManager
Container 위에 Component들을 올릴 때 자리 배치 방법
(예) FlowLayout, BorderLayout , GridLayout , CardLayout , GridBackLayout ...
상속을 받을 때는 많이 사용하는 요소를 상속 받는 것이 좋음.
화면 생성은 프로그램 초기에 이루어져야 하므로 주로 생성자에서 작업이 이루어짐.
//Container 위에 Component 추가 방법
프레임.add(Component component);
//크기 지정
프레임.setSize(int x, int y);
//Container 보이기
프레임.setVisible(Boolean b);
간단한 프레임 예제
import java.awt.Button;
import java.awt.Frame;
public class FrameExam
{
Frame frame = new Frame("ㅎㅎㅎ");
Button button = new Button("ㅋㅋㅋ");
public void createFrame()
{
//프레임에 컴포넌트 추가
frame.add(button);
//프레임 크기 지정
frame.setSize(300, 600);
//프레임 보이기
frame.setVisible(true);
}
public static void main(String[] args)
{
//프레임 열기
FrameExam frameExam = new FrameExam();
frameExam.createFrame();
}
}
간단한 J프레임 예제
import javax.swing.JButton;
import javax.swing.JFrame;
public class FrameExam
{
JFrame frame = new JFrame("ㅎㅎㅎ");
JButton button = new JButton("ㅋㅋㅋ");
public void createFrame()
{
//프레임에 컴포넌트 추가
frame.add(button);
//프레임 크기 지정
frame.setSize(300, 600);
//프레임 보이기
frame.setVisible(true);
//swing에만 있는 X버튼 클릭시 종료
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
//프레임 열기
FrameExam frameExam = new FrameExam();
frameExam.createFrame();
}
}
컴포넌트 레이아웃 변경 방법
ㅁ.setLayout(LayoutManager lm);
FlowLayout
기본적으로 컴포넌트들이 왼쪽에서 오른쪽으로 추가되는 형태
Container의 크기가 변경되면 컴포넌트크기는 고정되고 위치는 변한다.
기본적으로 가운데 정렬!
(예) Panel, Applet
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ButtonThree extends JFrame
{
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
public ButtonThree()
{
//제목 설정
super("제목은 여기에!!");
//레이아웃 설정
this.setLayout(new FlowLayout());
//버튼 추가
this.add(b1);
this.add(b2);
this.add(b3);
//프레임 크기 지정
this.setSize(300, 400);
//프레임 보이도록 설정
this.setVisible(true);
//X버튼 눌렀을 때 닫히도록 설정
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
//실행
new ButtonThree();
}
}
BorderLayout
기본적으로 컴포넌트들이 틀 형태로 존재
BorderLayout 에 컴포넌트를 추가할 때는
ㅁ.add(컴포넌트, 위치); //위치 지정을 안하면 기본적으로 CENTER에 위치.
위치에 들어갈 수 있는 값은 BorderLayout.NORTH .... "North" ....
(예) Frame, Dialog
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BorderLayoutExam
{
//컴포넌트 생성
JFrame jFrame = new JFrame("제목ㅋㅋ");
JButton btn1 = new JButton("1번버튼");
JButton btn2 = new JButton("2번버튼");
JButton btn3 = new JButton("3번버튼");
JButton btn4 = new JButton("4번버튼");
JButton btn5 = new JButton("5번버튼");
public BorderLayoutExam()
{
//컴포넌트를 넣을 컨테이너 구하기
Container container = jFrame.getContentPane();
//컴포넌트를 컨테이너에 추가
container.add(btn1, BorderLayout.NORTH);
container.add(btn2, BorderLayout.EAST);
container.add(btn3, BorderLayout.WEST);
container.add(btn4, BorderLayout.SOUTH);
container.add(btn5, BorderLayout.CENTER);
//프레임 크기 지정
jFrame.setSize(300, 300);
//프레임 보이기 설정
jFrame.setVisible(true);
//종료 버튼 설정
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
//실행
new BorderLayoutExam();
}
}
GridLayout
테이블 형태의 레이아웃
이 레이아웃을 디폴트로 가지는 컴포넌트는 없음.
인수를 주지 않으면 행은 1행으로 고정되고 열이 계속 추가된다.
행/열 인수에 0이 들어갈 수 있는데, 예를들어 (2, 0) 이면 행은 2행으로 고정하고 열은 무한대로 늘어날 수 있다는 의미이다.
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridLayoutExam
{
JFrame jFrame = new JFrame("이번엔 GridLayout이다!!");
JButton [] btn = new JButton [6]; //6개 생성
public GridLayoutExam()
{
//GridLayout 적용
jFrame.setLayout(new GridLayout(3,2));
//컨테이너 가져오기
Container container = jFrame.getContentPane();
//컴포넌트 생성 및 추가하기
for(int i=0; i < btn.length; i++)
{
btn[i] = new JButton(i+"버튼");
container.add(btn[i]);
}
//프레임 크기 지정하기
jFrame.setSize(300,300);
//프레임 보이기
jFrame.setVisible(true);
//종료버튼에 대한 설정
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new GridLayoutExam();
}
}
구체적인 위치 지정하기
setLayout에는 null로
setBounds 로 직접적인 좌표값을 지정할 수 있다.
복합적인 레이아웃 설정하기
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CompositeLayout
{
JFrame jFrame = new JFrame(); //전체적인 프레임
JPanel jpanel = new JPanel(); //상단에 들어갈 패널
JButton [] btn = new JButton[4]; //버튼
public CompositeLayout()
{
//버튼 생성
for(int i=0; i<btn.length; i++)
{
btn[i] = new JButton(i+"번째 버튼");
}
//패널에 버튼 추가
jpanel.add(btn[0]);
jpanel.add(btn[1]);
jFrame.add(jpanel, "North"); //패널 추가
jFrame.add(btn[2], "West");
jFrame.add(btn[3], "Center");
//사이즈 및 보여짐 여부 설정
jFrame.setSize(300,300);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new CompositeLayout();
}
}
텍스트 컴포넌트
//텍스트 입력
JTextField text = new JTextField("이름입력주세요.", 가로길이 - FlowLayout에서 의미가 있음);
//스크롤바가 기본적으로 있는 AWT 텍스트 필드
TextArea textArea = new TextArea(); //스크롤바 기본 있음.
//Swing에서의 텍스트 영역.. 스크롤바가 존재하지 않는다.
JTextArea textArea = new JTextArea("내용 입력하세요.", 5,10);//스크롤바 없음
//Swing에서 스크롤바를 넣기 위해 아래와 같이 사용한다.
JScrollPane jp = new JScrollPane(textArea);//스클롤바 만들기
//패스워드를 위한 필드
JPasswordField pwd = new JPasswordField();
체크박스 컴포넌트
//취미(멀티선택)
Checkbox hobby1 = new Checkbox("수영");
Checkbox hobby2 = new Checkbox("등산", true);
Checkbox hobby3 = new Checkbox("낚시");
Checkbox hobby4 = new Checkbox("놀고먹기", true);
//성별(단일선택)
CheckboxGroup group = new CheckboxGroup();
Checkbox man = new Checkbox("남자" , true, group);
Checkbox woman = new Checkbox("여자" , false, group);
리스트 컴포넌트
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.List;
import java.awt.TextArea;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class ListExam extends JFrame
{
String ch_item[] =
{ "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일" };
// List list = new List(3);//3행으로 보여짐(단일선택)
List list = new List(4, true);// 4행으로 보여지고 멀티선택가능
TextArea text = new TextArea(5, 20);// 5행 10열
public ListExam()
{
super("JComboBoxExam 입니다.");
// 레이아웃 변경
setLayout(new FlowLayout());
// List에 항목 추가
for (String str : ch_item)
list.add(str);
// 추가
super.add(list);
super.add(text);
// 크기
setSize(400, 300);
// 보여줘
setVisible(true);
// x클릭
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new ListExam();
}
}
파일 다이얼로그 컴포넌트
import java.awt.FileDialog;
import javax.swing.JFrame;
public class FileDialogExam extends JFrame
{
public FileDialogExam()
{
FileDialog load = new FileDialog(this, "열기모드");
FileDialog save = new FileDialog(this, "저장모드", FileDialog.SAVE);
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
load.setVisible(true); // 파일 불러오기 창 열기
System.out.println("선택폴더 : " + load.getDirectory());
System.out.println("선택파일 : " + load.getFile());
save.setVisible(true); // 파일 저장하기 창 열기
}
public static void main(String[] args)
{
new FileDialogExam();
}
}
J다이얼로그 컴포넌트
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class JDialogExam
{
// 필요한 필드 선언
JFrame jFrame = new JFrame("J다이얼로그 예제");
JDialog jDialog = new JDialog(jFrame, "JDialog 타이틀");
JButton jButton = new JButton("Click");
// GUI 구현 생성자
public JDialogExam()
{
// 다이얼로그에 버튼 추가
jDialog.add(jButton, "South");
// 기본 프레임 크기와 보기 설정
jFrame.setSize(200, 200);
jFrame.setVisible(true);
//X버튼 누르면 프로그램 종료
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 다이얼로그의 크기와 보기 설정
jDialog.setSize(100, 100);
jDialog.setVisible(true);
//★X버튼 누르면 다이얼로그만 종료
jDialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public static void main(String[] args)
{
//실행
new JDialogExam();
}
}
JOptionPane 예제
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class JOptionPaneExam extends JFrame
{
public JOptionPaneExam()
{
super("타이틀ㅋㅋ");
//간단한 메시지창
JOptionPane.showMessageDialog(this, "축하합니다");
//간단한 확인창
System.out.println(JOptionPane.showConfirmDialog(this, "선택하시겠습니까?"));
// Yes : 0
// No : 1
//CANCEL : 2
//사용자 입력창(간단한 입력값 받는 창)
System.out.println(JOptionPane.showInputDialog(this, "이름은?"));
setSize(500,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new JOptionPaneExam();
}
}
메뉴 만들기
JMenuBar : JMenu를 올릴 틀
JMenu : 눌렀을 때 서브가 존재하는 경우
JMenuItem : 바로 실행으로 연결되는 경우
JMenuItem을 JMenu에 add하고, JMenu를 JMenuBar에 add한다.
메뉴는 메뉴만의 자리가 따로 존재한다.
Frame의 North에 들어가는 것이 아니다.
JFrame.setJMenuBar( JMenuBar );
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class MenuExam
{
// 프레임 선언
JFrame jFrame = new JFrame("Menu예제");
// Swing에서의 텍스트 영역.. 스크롤바가 존재하지 않는다.
JTextArea textArea = new JTextArea("내용 입력하세요.", 5, 10);// 스크롤바 없음
// Swing에서 스크롤바를 넣기 위해 아래와 같이 사용한다.
JScrollPane jp = new JScrollPane(textArea);// 스클롤바 만들기
// 메뉴 선언
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("파일");
JMenu helpMenu = new JMenu("Help");
public MenuExam()
{
// 파일 메뉴 생성
fileMenu.add(new JMenuItem("새 파일"));
fileMenu.getItem(0).setAccelerator
(KeyStroke.getKeyStroke('N', InputEvent.CTRL_MASK ^ InputEvent.ALT_MASK)); //단축키설정
fileMenu.add(new JMenuItem("열기"));
fileMenu.add(new JMenuItem("저장"));
fileMenu.addSeparator(); //구분선 추가
fileMenu.add(new JMenuItem("종료"));
// 도움 메뉴 생성
helpMenu.add(new JMenuItem("버전"));
helpMenu.add(new JMenuItem("정보"));
// 메뉴를 메뉴바에 등록
menuBar.add(fileMenu);
menuBar.add(helpMenu);
// 메뉴바 추가
jFrame.setJMenuBar(menuBar);
// 텍스트 영역 추가
jFrame.add(jp, "Center");
// 프레임 크기 지정
jFrame.setSize(300, 300);
// 프레임 보이기
jFrame.setVisible(true);
// swing에만 있는 X버튼 클릭시 종료
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
// 실행
new MenuExam();
}
}