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(); } }