용어정리
본문정리
자바의 GUI
자바는 AWT와 Swing 패키지 등 GUI 라이브러리를 제공한다. 각각 java. awt와 javax.swing 패키지를 통해 공급된다.
AWT의 컴포넌트들은 중량 컴포넌트로 불린다. 운영체제의 도움을 받아 화면에 출력되어 운영체제의 자원을 많이 소모하기 때문이다. 따라서 맥과 윈도우 등 운영체제에 따라 다른 모양으로 그려진다.
Swing은 AWT와 달리 순수 자바 언어로 작성 되었고, 경량 컴포넌트로 불린다. 운영체제와 상관없이 동일하게 작동되며 AWT컴포넌트들이 100% 호환되도록 작성되었다. AWT 컴포넌트와 구분하기 위해 모두 대문자 J로 시작한다. AWT를 바탕으로 작성하였으므로 AWT 패키지가 필요하며, 스윙 컴포넌트와 AWT 컴포넌트를 혼용해선(한 프로그램에 동시 사용) 안된다.
따라서 다양하고 모양이 예쁜 스윙 사용을 권장한다.
자바의 GUI 패키지
모든 GUI 컴포넌트는 Component 클래스를 반드시 상속 받는다. 또한 JApplet, JFrame, FDialog를 제외한 모든 스윙 컴포넌트들은 JComponent를 상속받는다. GUI 컴포넌트들은 다른 컴포넌트를 포함할 수 있는지 여부에 따라 순수 컴포넌트와 컨테이너로 분류된다.
컨테이너란 GUI 컴포넌트를 포함할 수 있는 컴포넌트이다. 즉 컨테이너도 컴포넌트이다. 컨테이너로 동작하는 클래스는 다음과 같다.
Frame, Panel, Applet, Dialog, Window // AWT 컨테이너
JFrame, JPanel, JApplet, JDialog, JWindow // 스윙 컨테이너
컴포넌트란 컴포넌트를 포함할 수 없으며 컨테이너에 포함되어야 비로소 화면에 출력될 수 있는 GUI객체이다. AWT나 스윙의 모든 컴포넌트들은 java.awt.Component를 상속받기 때문에 Component 클래스에는 모든 컴포넌트들의 공통적인 속성과 기능이 작성되어 있다.
쵯상위 컨테이너란 다른 컨테이너에 속하지 않고도 독립적으로 화면에 출력될 수 있는 컨테이너이다. JFrame, JDialog, JApplet이 이에 속한다.
자식 컴포넌트란 컨테이너에 부착된 컴포넌트들이다.
스윙 GUI 프로그램 만들기
3가지 과정이 필요하다( 스윙 프레임 작성 → main() 메소드 작성 → 프레임에 스윙 컴포넌트 붙이기 )
컨테이너와 배치
스윙 패키지를 사용하기 위해 다음을 import한다.
import javax.swing.*;
스윙 프레임은 최상위 컨테이너로 출력할 때 부착된 모든 컴포넌트들이 화면에 출력된다.
JFrame이 스윙에서 프레임의 역할을 수행한다. JFrame 객체는 Frame, 메뉴바, 컨텐트팬의 3공간으로 구성된다.
Frame은 AWT패키지에 있는 클래스이고, 메뉴바는 메뉴바를 부착하는 공간이고, 컨텐트팬은 메뉴를 제외한 모든 GUI 컴포넌트들을 부착하는 공간이다. 즉 메뉴를 만들어 JFrame의 메뉴바에 부착하고, 화면에 출력하고자 하는 GUI 컴포넌트들은 컨텐트팬에 부착하여야 한다.
스윙 응용프로그램에서 main()의 기능은 최소화하는 것이 좋다.
타이틀 달기 위한 방법은 다음과 같다.
public MyFrame(){
super("타이틀문자열"); // 1번 방법, JFrame의 생성자를 호출하여 타이틀 달기
setTitle("타이틀문자열"); // 2번 방법, 메소드를 호출하여 타이틀 달기
}
메뉴 붙이기는 14장에서 다룬다.(다만 메뉴바를 만들고, 메뉴를 붙이고, 메뉴에는 여러 개의 메뉴 아이템을 붙이는 것이 순서이다)
컨텐트팬에만 컴포넌트를 부착할 수 있다.(JFrame 객체가 생길 때 컨테트팬이 자동으로 생성된다) 현재 프레임에 붙어있는 컨테트팬을 알아내기 위해선 getContentPane() 메소드를호출하면 된다. 컨텐트팬에 컴포넌트를 붙이는 것은 add() 메소드를 이용하는 것이다.
public class MyFrame extends JFrame{
public MyFrame{
Container contentPane = getContentPane();
JButton button = new JButton("Click");
contentPane.add(button);
}
setContentPane() 메소드는 기존의 컨텐트팬을 제거하고 새로운 컨텐트팬을 붙일 수 있다.
class MyPanel extends JPanel{} //JPanel은 Container를 상속받는 컨테이너로 컨텐트팬이 될 수 있음
frame.setContentPane(new MyPanel()); // 프레임의 컨텐트팬을 MyPanel 객체로 변경
프로그램을 종료하려면 System.exit(0);을 입력하면 된다.
프레임 윈도우의 오른쪽 상단에 있는 X를 누른다고 프로그램은 종료되지 않는다. 단순히 화면에서 사라지는 것이다. 이를 구현하기 위해선 fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);를 입력해야 한다.
JFrame객체를 생성하면 이벤트 처리(분배) 스레드가 자동으로 생성된다. main()메소드가 종료(main 스레드 종료)된 이후에도 위의 스레드가 살아 있어 키와 마우스 입력을 계속 처리한다.
컨테이너와 배치
컨테이너 내부에 있는 배치관리자가 컨테이너에 부착되는 컴포넌트들의 위치오 크기를 결정한다.다음은 배치와 관련하여 AWT나 스윙의 컨테이너는 다음과 같다.
컨터에니너마다 배치관리자가 하나씩 있다(삭제 가능)
컨테이너에 컴포넌트가 부착되는 시점에 컴포넌트의 위치와 크기를 결정
컨테이너의 크기가 변경되면 배치관리자가 모든 컴포넌트들의 위치와 크기를 제조정
배치관리자는 java.awt 패키지에 존재하며(import java.awt.*;) 대표적으로 4가지가 있다.
FlowLayout : 부착 순서대로 왼쪽에서 오른쪽으로 컴포넌트를 배치하며, 오른쪽에 공간이 없으면 아래로 내려와 다시 왼쪽에서 오른쪽으로 부착, 컴포넌트 키기는 화면에 출력될 수 있는 적당한 크기로 설정.
BorderLayout : 컨테이너 공간을 동서남북중앙의 5개 영역으로 나누고 지정한다. 지정안하면 중앙에 배치된다. 컴포넌트의 크기는 영역의 크기에 맞추어 설정
GridLayout : 응용프로그램에서 설정한 동일한 크기의 2차원 격자로 나눔, 삽입 순서대로 좌에서 우, 위에서 아래로 배치, 크기는 셀의 크기와 동일하게 설정
CardLayout : 트럼프카드 쌓아올리듯 배치(창 무수히띄우면 겹쳐서 뜨는 것처럼), 컨테이너의 크기와 동일하게 설정
이하는 디폴트 배치관리자이다.
Window, JWindow | BorderLayout |
Frame, JFrame | BorderLayout |
Dialog, JDialog | BorderLayout |
Panel, JPanel | FlowLayout |
Applet, JApplet | FlowLayout |
배치관리자를 마음대로 설정할 수 있다.
Container.setLayout(LayoutManeger lm); // lm을 새로운 배치관리자로 설정
JPanel p = new JPanel();
p.setLayout(new BorderLayout()); // 패널에 BorderLayout 배치관리자 설정
Container contentPane = frame.getContentPane(); //프레임의 컨텐트팬
contentPane.setLayout(new FlowLayout()); // FlowLayout 배치관리자 설정
FlowLayout 배치관리자
해당 배치관리자는 add() 메소드를 이용하면 된다.
FlowLayout(int align, int hGap, int vGap);
align : 컴포넌트의 정렬 방법(LEFT : 왼쪽 정렬, RIGHT : 오른쪽 정렬, CENTER : 중앙 정렬)
hGap : 좌우 컴포넌트 사이의 수평 간격, 픽셀단위, 디폴트 5
vGAap : 상하 컴포넌트 사이의 수직 간격, 픽셀단위, 디폴트 5
BorderLayout 배치관리자
컴포넌트를 삽입하기 위해서는, add() 메소드에 컴포넌트의 위치를 명확히 정해주어야 한다.
void add(Component comp, int index);
comp : 컨테이너에 삽입되는 컴포넌트
index : 컴포넌트의 위치(BorderLayout.EAST·WEST·SOUTH·NORTH·CENTER)
해당 배치관리자를 사용하면 5개의 컴포넌트 밖에 붙일 수가 없다. 이상을 부착하려면 다른 컨테이너를 부착하고 이곳에 컴포넌트를 부착하면 된다.
생성자는 다음과 같다.
BorderLayout();
BarderLayout(int hGap, int vGap);
hGap : 좌우 두 컴포넌트 사이의 수평간격, 디폴트는 0
vGap : 상하 두 컴포넌트 사이의 수직간격, 디폴트는 0
GridLayout 배치관리자
생성자는 다음과 같다.
GridLayout();
GridLayout(int rows, int cols);
GridLayout(int rows, int cols, int hGap, int vGap);
rows : 그리드의 행 수, 디폴트는 1
cols : 그리드의 열 수, 디폴트는 1
hGap : 좌우 컴포넌트 사이의 수평 간견, 픽셀 단위, 디폴트는 0
vGap : 상하 컴포넌트 사이의 수직 간격, 픽셀 단위, 디폴트는 0
배치관리자 없는 컨테이너
배치관리자가 컴포넌트의 위치와 크기를 결정하도록 한다. 이것이 단점이 될 수 있다.
시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기가 수시로 변하는 경우
겹치는 효과를 연출하고자 하는 경우
제거하는 방법은 다음과 같다.
container.setLayout(null); // container의 배치관리자 제거
JPanel p = new JPanel();
p.setLayout(null);
삽입된 컴포넌트들은 모두 0x0 크기로 설정되어 보이지 않는다.
java.awt.Component 클라스를 사용하여 절대 위치와 크기를 설정할 수 있다.
void setSize(int width, int height) //컴포넌트를 width * height 크기로 설정
void setLocation(int x, int y) // 컴포넌트의 왼쪽 상단 모서리 좌표를 x, y로 설정
void setBounds(int x, int y, int width, int height) // 크기와 위치 동시 설정
서로 겹치도록 배치 할 수 있다.
본문제
Q1. "Let's study Java"라는 문자열을 타이틀로 가지고 프레임의 크기가 400*200인 스윙 프로그램을 작성하라.
package gui;
import javax.swing.*;
import java.awt.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("Let's study Java");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setSize(400, 200);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q2. BoderLayout을 사용하여 컴포넌트 사이의 수평 수직 간격이 각각 5픽셀, 7픽셀이 되도록 스윙 응용프로그램을 작성하라.
package gui;
import javax.swing.*;
import java.awt.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("BorderLayout");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = super.getContentPane();
c.setLayout(new BorderLayout(5, 7));
c.add(new JButton("North"), BorderLayout.NORTH);
c.add(new JButton("West"), BorderLayout.WEST);
c.add(new JButton("Center"), BorderLayout.CENTER);
c.add(new JButton("East"), BorderLayout.EAST);
c.add(new JButton("South"), BorderLayout.SOUTH);
super.setSize(400, 200);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q3. GridLayout을 사용하여 다음 그림과 같이 한 줄에 10개의 버튼을 동일한 크기로 배치하는 스윙 프로그램을 작성하라.
package gui;
import javax.swing.*;
import java.awt.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("Ten Color Buttons Frame");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = super.getContentPane();
c.setLayout(new GridLayout(1, 10));
for(int i = 1; i <11; i++) {
c.add(new JButton(i + " "));
}
super.setSize(600, 300);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q4. 문제 3을 수정하여 다음 결과와 같이 각 버튼의 배경색을 서로 다르게 설정하라.
package gui;
import javax.swing.*;
import java.awt.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("Ten Color Buttons Frame");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Color k[] = {Color.RED, Color.ORANGE, Color.yellow, Color.green, Color.CYAN, Color.blue, Color.magenta, Color.gray,
Color.pink, Color.white
};
Container c = super.getContentPane();
c.setLayout(new GridLayout(1, 10));
for(int i = 0; i <10; i++) {
String text = Integer.toString(i+1);
JButton jb = new JButton(text);
jb.setOpaque(true);
jb.setBackground(k[i]);
c.add(jb);
}
super.setSize(600, 300);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q5. GridLayout을 이용하여 다음 그림과 같이 16개의 색을 배경색으로 하는 4*4 바둑판을 구성하라.
package gui;
import javax.swing.*;
import java.awt.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("4*4 Color Frame");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Color[] col= {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA,
Color.GRAY, Color.PINK, Color.LIGHT_GRAY, Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN,
Color.CYAN, Color.BLUE};
Container c = super.getContentPane();
c.setLayout(new GridLayout(4,4));
for(int i = 0; i < 16; i++) {
String text = Integer.toString(i);
JLabel jb = new JLabel(text);
jb.setOpaque(true);
jb.setBackground(col[i]);
c.add(jb);
}
super.setSize(600, 300);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q6. 20개의 10*10 크기의 JLabel 컴포넌트가 프레임 내에 (50,50) 위치에서 (250,250) 영역에서 랜덤한 위치에 출력되도록 스윙프로그램을 작성하라. 프레임의 크기는 300*300으로 하라.
package gui;
import javax.swing.*;
import java.awt.*;
import java.math.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("Random Labels");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = super.getContentPane();
c.setLayout(null);
for(int i = 0; i < 20; i++) {
String text = Integer.toString(i);
JLabel jb = new JLabel(text);
jb.setSize(10,10);
jb.setOpaque(true);
jb.setBackground(Color.blue);
int x = (int)(Math.random() * 200) + 50;
int y = (int)(Math.random() * 200) + 50;
jb.setLocation(x, y);
c.add(jb);
}
super.setSize(300, 300);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q7. 다음과 같은 GUI 모양을 가진 스윙 프레임을 작성하라.
package gui;
import javax.swing.*;
import java.awt.*;
import java.math.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("계산기 프레임");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = super.getContentPane();
JPanel pn = new JPanel();
JPanel pc = new JPanel();
JPanel ps = new JPanel();
pn.setBackground(Color.gray);
pc.setBackground(Color.white);
pc.setLayout(new GridLayout(4,4));
ps.setBackground(Color.yellow);
c.add(pn, BorderLayout.NORTH);
c.add(pc, BorderLayout.CENTER);
c.add(ps, BorderLayout.SOUTH);
JLabel jl1 = new JLabel("수신입력");
JTextField jt1 = new JTextField(10);
pn.add(jl1); pn.add(jt1);
JLabel jl2 = new JLabel("계산결과");
JTextField jt2 = new JTextField(10);
ps.add(jl2); ps.add(jt2);
for(int i = 0; i < 10; i++) {
String text = Integer.toString(i);
JButton jb = new JButton(text);
pc.add(jb);
}
String str[] = {"CE", "계산", "+", "-", "X", "/"};
for(int i = 0; i < 6; i++) {
pc.add(new JButton(str[i]));
}
super.setSize(400, 400);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
Q8. 다음과 같은 GUI 모양을 가진 스윙프레임을 작성하라.
package gui;
import javax.swing.*;
import java.awt.*;
import java.math.*;
class Myframe extends JFrame{
public Myframe() {
super.setTitle("계산기 프레임");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = super.getContentPane();
JPanel pn = new JPanel();
JPanel pc = new JPanel();
JPanel ps = new JPanel();
pn.setBackground(Color.gray);
pc.setBackground(Color.white);
ps.setBackground(Color.yellow);
JButton jb1 = new JButton("열기");
JButton jb2 = new JButton("닫기");
JButton jb3 = new JButton("나가기");
pn.add(jb1); pn.add(jb2); pn.add(jb3);
JButton jb4 = new JButton("Word Input");
JTextField jt = new JTextField(10);
ps.add(jb4); ps.add(jt);
for(int i = 0; i < 10; i++) {
pc.setLayout(null);
int x = (int)(Math.random()*250);
int y = (int)(Math.random()*250);
JLabel jl = new JLabel("*");
jl.setLocation(x, y);
jl.setSize(10,10);
jl.setOpaque(true);
jl.setBackground(Color.red);
pc.add(jl);
}
c.add(pn, BorderLayout.NORTH);
c.add(pc, BorderLayout.CENTER);
c.add(ps, BorderLayout.SOUTH);
super.setSize(400, 400);
super.setVisible(true);
}
}
public class problem {
public static void main(String [] args) {
Myframe mf = new Myframe();
}
}
'java > 학교,기관' 카테고리의 다른 글
자바의 이벤트 처리(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.12.04 |
---|---|
입출력 스트림과 파일 입출력(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.11.24 |
제네릭과 컬렉션(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.11.21 |
모듈과 패키지 개념, 자바 기본 패키지(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.11.10 |
상속(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.22 |
댓글