코드 그라데이션

<보충> Day33,34 자바 GUI 이모저모 본문

Java/Mega

<보충> Day33,34 자바 GUI 이모저모

완벽한 장면 2023. 5. 10. 02:40

- 자바 GUI는 요즘 워낙 안 쓰기 때문에 중요도가 너무 많이 떨어진다.

 

- 화면에 보이는 것들은 다 객체로 이루어져있고,

필요하면 다 add를 써서 붙인다.

ex. Container, GridLayout, JButton 등.

 

- 콘솔 액션은 사실상 Enter 하나인데,

- GUI는 액션이 정말 많다.

ex. 마우스가 움직이거나,  클릭하거나, 입력하는 행위를 하거나....

=> 그래서 ActionListener를 만들어서

    액션을 수행할 때, 액션리스너는 그 액션을 듣고 있다가 뭔가를 하겠다.

 

- Container는 '도화지'라고 이해하면 편하다.

 

* 중요한 것은 콘솔 입출력과 크게 다르지 않으나, 액션이 다양하다의 느낌만 가져가는 것.

 

GUI에서는 Action라는 개념을 도입해서,

그 액션을 계속 리스너가 듣고만 있다.

그 듣고만 있는 애를 어떤 버튼에다가 붙여두면

그 버튼에서 어떤 상호작용이 발생했을 때, 

actionPerformed의 행동이 실행되게 하겠다.

(if문이 없어도 조건 실행이 가능하게 됨)

 

다시 예제에 필기한 것을 정리하면

1.

class Grid extends JFrame implements ActionListener {
  JButton[] jbArray = new JButton[20];
  Grid() {
    // 컨테이너를 가져와서 GridLayout을 설정합니다.
    Container ct = getContentPane();
    GridLayout gl = new GridLayout(4,5,10,10);
    ct.setLayout(gl);

    // 20개의 버튼을 생성하고 ActionListener를 등록합니다
    for(int i = 1;i<=20;i++) {
      jbArray[i-1] = new JButton("버튼"+i);
      jbArray[i-1].addActionListener(this);
      ct.add(jbArray[i-1]);
    }

    // 프레임(창)의 제목과 크기를 설정하고 보이도록 설정합니다.
    setTitle("Grid"); // 프레임이 가지고 있는 타이틀
    setSize(800,800); // 창의 크기
    setVisible(true); // 창을 보이게 만들겠다.
    // 이 메서드는 JFrame에서 제공
  }

  public void actionPerformed(ActionEvent ae) {
    System.out.println(ae.getActionCommand());
    // 이걸 하면 무슨 버튼을 눌렀는지가 콘솔에 나옴.

  }

}


public class GridLayoutTest {

  public static void main(String[] args) {

    new Grid();
  }

}

 

2.

class GUIMake extends JFrame implements ActionListener { // 전체 화면이 됨.

  private JTextField jtf; // 한 줄 글자 입력할 수 있는 칸
  private JTextArea jta; // 여러 줄 입력할 수 있는 칸.

  GUIMake() {
    JButton jb = new JButton("Save"); // 버튼 만듦(화면에 생김)
    jtf = new JTextField("파일 이름을 입력하시오", 20);
    jta = new JTextArea("파일에 쓸 글을 적으시오", 20, 20);

    Container ct = getContentPane(); //객체생성x, JFrame에서 사용할 수 있게 만드는 애.
    // 컨테이너는 JFrame에서 제공. 컨테이너에 담아줌.
    // 컨테이너는 도화지
    // 이 도화지에 레이아웃 깔아주고
    ct.setLayout(new FlowLayout()); // 내용 넘치면 자동으로 다음줄에 작성

    JPanel p = new JPanel(); // 패널 만들어서
    ct.add(jta); // 도화지에 텍스트에어리어 추가
    p.add(jtf); // 패널에 텍스트필드 추가
    p.add(jb); // 패널에 버튼 추가
    ct.add(p); // 마지막에 판넬 자체를 통으로 붙여버렸음=> 패널 자체를 도화지에 넣음.(세트화되어서 딱 붙음)
    // 아래로 내려간 이유는, 옆에 붙이려했는데 넘쳐서 자동으로 내려감.
    jb.addActionListener(this); //Save버튼 누르면 액션리스너가 동작하게 만듦.
    //=>버튼 눌렀으면 actionPerformed()메서드가 동작
    // this를 붙인 이유는 내가 ActionListener를 구현했으므로 나에게 있으니까.

    setTitle("Test1");
    setSize(500, 500);
    setVisible(true); // 보여줄거니?
  }

  public void actionPerformed(ActionEvent ae) { // 액션을 인자로 받아서
    try {
      // jtf에서 입력된 문자열을 가져와서 s 변수에 저장합니다.
      String s = jtf.getText(); // 텍스트 필드에 작성했던 텍스트 가져와서
      // s에 해당하는 파일을 생성하기 위해 FileOutputStream을 생성합니다.
      FileOutputStream fos = new FileOutputStream(s); // 걔를 파일에 쓰겠다.
      // 생성된 FileOutputStream을 사용하여 DataOutputStream을 생성합니다.
      DataOutputStream dos = new DataOutputStream(fos);
      // jta에서 입력된 문자열을 UTF-8 형식으로 파일에 저장합니다.
      dos.writeUTF(jta.getText());
      // FileOutputStream을 닫습니다.
      fos.close();
      // 생성된 파일 이름을 콘솔에 출력합니다.
      System.out.println(s + " 파일 생성~~~~");
    }
    // 예외 발생 시 처리합니다.
    catch (Exception e) {
      // 예외 처리 내용을 작성합니다.
    }
  }
}

public class GUITest1 {

  public static void main(String[] args) {
    new GUIMake();
  }
}

 

3.

class Hi extends JFrame implements ActionListener {
  JLabel jl; // 무언가를 설명해주는 라벨
  Hi(){
    // 컨테이너를 가져와서 FlowLayout을 설정합니다.
    Container ct = getContentPane(); // 도화지 만들어서 레이아웃을 짜주고
    ct.setLayout(new FlowLayout());

    // 두 개의 버튼을 생성합니다.
    JButton j1 = new JButton("10");
    JButton j2 = new JButton("20");

    // JLabel을 생성하고 컨테이너에 추가합니다.
    jl = new JLabel("하이!!!!!"); // 라벨에 하이!!라고 씀
    ct.add(j1); // 도화지에 버튼 두 개 추가하고
    ct.add(j2);
    ct.add(jl); // 도화지에 라벨도 추가

    // 버튼에 ActionListener를 등록합니다
    j1.addActionListener(this); //즉, Hi라는 ActionListener를 여기서 만든 첫번째 버튼(j1)에다가 넣은 것.
    // 즉, this는 ActionListener <- 왜냐면 Hi도 ActionListener라고 볼 수 있으니까.
    j2.addActionListener(this);
    /*
    액션리스너에 다시 자기자신을 넣는 게 아니라,
    j1이라는 버튼에게 ActionListener를 자기 자신으로 단 것이다.
    => 즉 들어가는 것은 모두 j1에 저장이 된다는 뜻.
    => "j1에 어떤 액션이 발생하면 내가 듣겠다."
    => 내가 듣겠다는 말은
  public void actionPerformed(ActionEvent ae) {
    String input = ae.getActionCommand();
    String result = "힘내세요!!!!" + input;
    jl.setText(result);
    System.out.println(input);
  } 이 일을 하겠다!!
     */

    // 프레임의 제목과 크기를 설정하고 보이도록 설정합니다.
    setTitle("Two");
    setSize(500,500);
    setVisible(true);
  }

  public void actionPerformed(ActionEvent ae) {

    String input = ae.getActionCommand(); // 이벤트에서 액션 명령을 가져와서 input 변수에 저장합니다.
    String result = "힘내세요!!!!" + input; // result 변수에 "힘내세요!!!!"와 input 변수를 결합하여 저장합니다.
    jl.setText(result); // 이 result 결과를 jl(라벨)에다가 쓰겠다.
    System.out.println(input);
    //=>즉, j1이든 j2든 버튼이 눌리면 하이!!!라는 라벨이 힘내세요!!!라고 바뀌겠구나. 라고 알 수 있는 거죠.
  }
}

public class GUITest2 {

  public static void main(String[] args) {

    new Hi();
  }
}
728x90
Comments