본문 바로가기

국비지원

[JAVA] 221130 - JFrame, swing, swing layout 종류

반응형

JFrame란

jframe은 java swing 클래스의 일부이며 구현되는 하나의 창이다.

스윙은 자바에서 그래픽 사용자 인터페이스를 구현하기 위하여 제공되는 클래스

또한 버튼, 창, 표, 트리 등의 컴포넌트들을 이용할 수 있게 해주는 클래스 이다.

창에서의 메인 프레임으로 볼 수 있다.

 

*JPanel

메인 프레임 위에 올라가는 보조 프레임

*JLabel 등등 각 종 "UI" ex) JButton, JTextField ..

기능을 수행하는 컴포넌트

 

*카운트, 감소, 리셋 버튼을 구현한 창

class MyFrame extends JFrame implements ActionListener {
	private JLabel lb1Number;
	private int number;
	
	public MyFrame() {
		number = 1;
		
		JPanel pn1 = new JPanel();
		add(pn1);
		
		JLabel lb1 = new JLabel("안녕하세요~");
		pn1.add(lb1);
		
		lb1Number = new JLabel(String.valueOf(number));
		pn1.add(lb1Number);
		
		JButton btnIncrese = new JButton("카운트");
		btnIncrese.addActionListener(this);
		pn1.add(btnIncrese);
		
		JButton btnDecrese = new JButton("감소");
		btnDecrese.addActionListener(this);
		pn1.add(btnDecrese);
		
		JButton btnReset = new JButton("리셋");
		btnReset.addActionListener(this);
		pn1.add(btnReset);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public void showGUI() {
		setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if (command.equals("카운트")) {
			number++;
		} else if (command.equals("감소")) {
			number--;
		} else if (command.equals("리셋")) {
			number = 1;
		}
		lb1Number.setText(String.valueOf(number));
	}
	
}
public class Main {
	public static void main(String[] args) {
		MyFrame f = new MyFrame();
		f.showGUI();
	}
}

*코드 정리

1.코드에서 핵심은 패널을 생성하고 버튼을 3개 만든다.

2.각 버튼에 액션리스너를 추가 한 후 getActionCommand를

활용하여 버튼에 맞게 필드 변수를 증감시켜주면 된다.

3.여기서 numbers를 필드로 만들어 버튼에 따라 값이 변하게 하고,

JLabel 파라미터에는 String타입만 넣을 수 있는데,

레퍼클래스를 활용해 정수로 선언된 numbers를 스트링 타입으로 변환하여 들어갈 수 있게 한다.

 

 

 

 

 

*tip

지역변수로 선언된 변수를 필드로 만들고 싶을 때, 해당 변수에 마우스를 올리고 Ctrl + 1을 눌러 3번째 "Convert local variable to field"를 선택하면 지역변수에서 필드로 변경이 된다. 

 

*사용자에게 입력 받은 두 값을 더하는 창

[생성자]

1.패널 인스턴스를 생성한다.

2.JTextField 두개를 생성해 사용자가 창에서 원하는 값을 입력할 수 있도록 한다.

3.연산을 실행할 버튼 하나를 만든다.

4.두 값이 더해져서 보여질 라벨을 생성한다.

5.패널 인스턴스에 텍스트필드, 버튼을 add한 후, pn1도 Frame에 add한다.

public TextInputFrame() {
		JPanel pn1 = new JPanel();
		
		left = new JTextField(3);
		right = new JTextField(3);
		JButton btnSum = new JButton("+");
		lb1Result = new JLabel("0");
		
		pn1.add(left);
		pn1.add(right);
		pn1.add(btnSum);
		pn1.add(lb1Result);
		
		add(pn1);
		btnSum.addActionListener(this);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

[액션리스너]

1.두 text field에서 받은 값을 레퍼클래스를 활용해 정수로 바꾼 후 더한 값을 sum변수에 초기화한다.

2.정수타입 sum을 다시 스트링타입으로 변경하여 lb1Result에 출력 될 수 있도록 한다.

3. 1번과 2번을 trycatch문을 활용해 예외상황을 체크한다.

public void actionPerformed(ActionEvent e) {
		System.out.println("버튼 동작 확인");
		try {
			int leftNum = Integer.parseInt(left.getText());
			int rightNum = Integer.parseInt(right.getText());
			int sum = leftNum + rightNum;
			lb1Result.setText(String.valueOf(sum));
		} catch (NumberFormatException excep) {
			lb1Result.setText("정수를 입력해야합니다.");
		}
	}

 

*JTextField 를 활용한 창

JTextField는 창에 텍스트박스를 띄워 사용자의 입력을 받을 수 있게끔 해준다.

class TextEnterFrame extends JFrame implements ActionListener {
	
	private JTextField tf;
	private JButton btn;
	public TextEnterFrame() {
		JPanel pn1 = new JPanel();
		tf = new JTextField(10);
		btn = new JButton("버튼");
		
		// textField에도 리스너를 붙일 수 있다.
		pn1.add(tf);
		pn1.add(btn);
		
		add(pn1);
		
		tf.addActionListener(this);
		btn.addActionListener(this);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public void showGUI() {
		setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		if (tf == source) {
			System.out.println("텍스트필드에서 액션이벤트 발생");
		} else if (btn == source) {
			System.out.println("버튼에서 액션이벤트 발생");
		}
	}
}

public class Main3 {

	public static void main(String[] args) {
		new TextEnterFrame().showGUI();
	}

}

Object source = e.getSource();

actionPerformed(ActionEvent e) 메소드에서

객체 e의 getSource를 통해 액션이벤트가 어떤

참조인지 알 수 있다. (getText와는 다른 것)

 

*add 할 때 주의 점

pn1.add(idLabel);
		pn1.add(idBox);
		pn1.add(passwordLabel);
		pn1.add(passwordBox);
		pn1.add(loginBtn);
		pn1.add(oX);

add순으로 창에 정렬된 모습

add한 순서대로 패널에 추가가 되고, 창에서도 add된 순서대로 정렬되는 것을 알 수 있었다.

 

swing Layout 종류

*Border Layout

1.버튼을 여러개 넣을 때 추가 파라미터가 없으면, 가장 마지막 컴포넌트만 생성 된다.

(파라미터를 통해 위치를 설정해줘야한다는 뜻)

2.파라미터에 문자열을 넣거나, 보더레이아웃의 상수로 접근하여 위치 설정이 가능하다.

3.보더레이아웃이 어떨 때 많이 사용될까?  이클립스에 이미 적용 되어있는 것을 배웠다.

JPanel pn1 = new JPanel();
		pn1.add(new JButton("1번"));
		pn1.add(new JButton("2번"));
		pn1.add(new JButton("3번"));
		pn1.add(new JButton("4번"));
		add(pn1, "North");
		
		JButton btnSouth = new JButton("남쪽");
		add(btnSouth, BorderLayout.SOUTH);
		
		JButton btnWest = new JButton("서쪽");
		btnWest.setPreferredSize(new Dimension(300, 0));
		add(btnWest, "West");
		
		JButton btnEast = new JButton("동쪽");
		add(btnEast, "East");

동 서 남 북 중앙, 자동으로 배치가 용이한 레이아웃

*setLayout(null)

setLayout을 하지않으면 default값으로 레이아웃이 설정되어 자동으로 BorderLayout으로 설정된다.

null로 설정시, 컴포넌트들을 수동으로 배치하겠다는 뜻이 된다.

public NonLayoutFrame() {
		// 자동으로 위치를 결정하던 것을 null로 > 수동
		// 레이아웃은 좌측상단이 원점이다.
		setLayout(null);
		
		JButton btn = new JButton("버튼입니다.");
		// setBounds로 새로운 원점에서 새로운 크기의 버튼을 생성할 수 있다.
		btn.setBounds(100, 150, 300, 50);
		
		JButton btn2 = new JButton("아래 버튼");
		btn2.setBounds(100, 210, 300, 50);
		
		add(btn);
		add(btn2);
        }

*FlowLayout

flowLayout 특징은 컴포넌트들의 나열 및 여백, 특정위치로 정렬을 해주기에 가장 쉽게 쓰는 레이아웃이다.

class TestFlowLayout extends JFrame {
	public TestFlowLayout() {
		FlowLayout flow = new FlowLayout();
		// setAlignment 파라미터에는 상수값을 가져와서 넣어주면 됨
		flow.setAlignment(FlowLayout.LEFT);
		// 각 컴포넌트 가로 여백 설정
		flow.setHgap(50);
		setLayout(flow);
		
		JButton btn1 = new JButton("버튼1");
		JButton btn2 = new JButton("버튼2");
		JButton btn3 = new JButton("~~~~ 버튼3 ~~~~");
		
		add(btn1);
		add(btn2);
		add(btn3);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
	}
	
	public void showGUI() {
		setVisible(true);
	}
}

flowlayout

 

 

*BoxLayout

BoxLayout특징 : 박스를 나열하듯 컴포넌트들을 정리한다.

X_AXIS 가로방향 나열, Y_AXIS 세로방향 나열

박스레이아웃은 파라미터에 참조가 꼭 필요하다.

박스가 쌓인듯한 정렬

*GridLayout

GridLayout 3행 3열에 버튼 9개 추가한 창

여러 일정한 버튼패드를 생성할 때 활용하면 편할듯 하다.

class TestGridLayout extends JFrame {
	public TestGridLayout() {
		// GridLayout 3행 3열에 버튼 9개를 추가
		// 왼쪽 위부터 차례대로 추가
		GridLayout grid = new GridLayout(3, 3);
		// 가로 여백
		grid.setHgap(5);
		// 세로 여백
		grid.setVgap(10);
		setLayout(grid);
		
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public void showGUI() {
		setVisible(true);
	}
}

.

3X3 버튼이 생성된 모습

 

반응형