본격적으로 그림을 그리기 전에
레이아웃 설정을 먼저 해주어야 한다.
패널에는 종류가 여러 가지가 있다.
패널의 레이아웃을 설정할 수 있다.
JFrame은 기본 패널 하나를 가지고 있다.
JFrame이 기본적으로 가지고 있는
패널이 무엇인지 확인해보기 위해
패널에 버튼을 추가해보자.
JPanel panel = (JPanel) getContentPane();
JButton btn1 = new JButton("버튼1");
panel.add(btn1);
프레임과 패널 앞에 J가 붙어있다.
J가 붙어있는 것이 스윙이고
안 붙어있는 것이 AWT 라이브러리이다.
버튼이 프레임에 꽉 차버렸다.
이걸 BorderLayout이라고 한다.
도화지를 꽉 채워 버린다.
레이아웃을 바꿔주기 위해서는 setLayout 메서드를 이용한다.
이 setLayout의 매개변수의 자리를 확인해보니
LayoutManager타입을 넣어주어야 한다.
LayoutManager는 인터페이스이다.
LayoutManager에 어떤 자식이 있는 줄 알고
setLayout에서 설정해줄까?
이때는 LayoutManager 인터페이스 근처에
주석을 확인해야 하는데
나와있는 내용이 없기 때문에,
문서를 확인하거나
구글링이 필요하다.
Layout의 종류에는 6가지가 있다.
FlowLayout
BorderLayout
GridLayout
BoxLayout
CardLayout
null
FlowLayout을 만들어보자.
FlowLayoutEx01 클래스에 생성자를 만들어준다.
빈 공간에 Ctrl + Space 키를 누르면 자동완성 창이 뜬다.
생성자 자동완성을 클릭해준다.
그리고 우리가 만들어두었던 MyFrame 클래스를 상속시켜준다.
불필요한 과정을 줄이기 위해 틀을 잡아두었던 클래스였다.
MyFrame 클래스가 JFrame 클래스를 상속받고 있기 때문에
결국 JFrame의 자식이 되는 것이다.
BorderLayout 만들 때와 같이
버튼을 추가해서 레이아웃의 모양을 확인해보자.
package site.metacoding.ex13;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FlowLayoutEx01 extends MyFrame{
public FlowLayoutEx01() {
System.out.println("FlowLayoutEx01");
JPanel panel = (JPanel) getContentPane(); // JFrame의 패널 가져오기
panel.setLayout(new FlowLayout()); // Layout 설정
JButton btn1 = new JButton("버튼1");
JButton btn2 = new JButton("버튼2");
JButton btn3 = new JButton("버튼3");
JButton btn4 = new JButton("버튼4");
panel.add(btn1);
panel.add(btn2);
panel.add(btn3);
panel.add(btn4);
setVisible(true); // 화면에 그림 그리기
}
public static void main(String[] args) {
new FlowLayoutEx01();
}
}
setVisible( )은 화면에 그림을 그려주는 메서드이다.
true 값을 넣어주면 그려진다.
setVisible 메서드를 사용할 때는
항상 그림의 마지막에 적어주는 것에 주의하자.
레이아웃을 바꿔주니
버튼의 크기가 달라졌다.
웹 브라우저와 같이 프레임의 크기에 따라
버튼의 위치가 흘러가며 배치된다.
이게 FlowLayout이다.
프레임 크기가 MyFrame에서 정해져 있기 때문에
변경이 불가능하다.
프레임 크기를 수정해주기 위해서는
부모 생성자를 오버 로딩해주면 된다.
package site.metacoding.ex13;
import javax.swing.JFrame;
public class MyFrame extends JFrame {
public MyFrame() {
super(); // 생략되어 있음
System.out.println("MyFrame 디폴트");
setSize(600, 400); // w, h
setLocationRelativeTo(null); // 프레임 화면 중앙 배치
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 닫기버튼 클릭시 main 종료
}
public MyFrame(int w, int h) {
super(); // 생략되어 있음
System.out.println("MyFrame 오버로딩 생성자");
setSize(w, h); // 가로, 세로
setLocationRelativeTo(null); // 프레임 화면 중앙 배치
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 닫기버튼 클릭시 main 종료
}
}
상속받은 자식의 코드에는 항상 super( );가 생략되어 있기 때문에
상속을 하면 항상 부모의 디폴트 생성자를 찍어준다.
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9