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된 순서대로 정렬되는 것을 알 수 있었다.
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);
}
}
*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);
}
}
.
'국비지원' 카테고리의 다른 글
[JAVA]122206 - Set , LinkedList, Queue, LinkedHashset, TreeSet, Map (0) | 2022.12.07 |
---|---|
[JAVA]221205 - Collection (List, 제네릭, 이터레이터) (2) | 2022.12.07 |
[JAVA]221202 - MouseListener, MouseAdapter, 익명클래스, KeyListener, JDialog (0) | 2022.12.04 |
[JAVA] 221201 - CardLayout, tabbedPane, JCheckBox, JRadioButton (0) | 2022.12.01 |
[JAVA] 221129 - 레퍼클래스, Exception, try catch, throw, GUI (0) | 2022.11.29 |