[JAVA] :: BUTTON

[JAVA] :: BUTTON

버튼 (BUTTON) :: 프레임은 자동배치라는 속성을 기본적으로 가지고있다. :: 자동배치 상태에서는 버튼 등의 컴포넌트가 프레임의 영역에 꽉 찬 상태로 배치된다. :: 프레임 안에 여러가지의 버튼을 배치시키는 경우 바튼이 프레임에 꽉찬 상태로 덮여쓰여지지 않도록 자동 배치를 꺼줘야한다. :: 자동 배치를 종료하는 경우 직접 컴포넌트의 크기와 위치를 지정해줘야한다. 컴포넌트란, 눈으로 볼 수 있는 모든 클래스의 부모격 객체로, BUTTON이나 PANNEL등이 속한다.

[예시] :: BUTTON

package test; import java.awt.Button; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestMain { public static void main(String[] args) { // Frame f = new Frame(); f.setBounds(500, 400, 400, 400); /* BUTTON과 자동 배치의 개념 FRAME은 기본적으로 ADD시키는 객체를 자신의 영역에 가득 채우게 되는 자동 배치 속성을 가지고있다. 만약 프레임안에 자동 배치를 끄지 않은 상태에서 버튼을 두개 넣게 되면 첫 버튼이 프레임에 꽉 차게 배치되고 추가로 배치된 버튼이 위에 프레임이 꽉차도록 덮여지게 될 것이다. FRAME에서 자식으로 가지는 객체들을 프레임안에서 겹치게 하지 않으려면 자동 배치를 꺼줘야한다. 만약 자동배치를 종료하게되면 프레임의 어느 위치에 어떤 크기로 배치할지 지정해줘야한다. */ // 자동 배치 종료 f.setLayout(null); // 버튼 생성 // 버튼의 인자로 들어가는 단어는 버튼의 명칭이 된다. Button btnOk = new Button("추가"); Button btnClose = new Button("종료"); // 버튼의 사이즈 지정 btnOk.setSize(100,50); btnOk.setLocation(70,90); btnClose.setBounds(230, 90, 100, 50); // 버튼 객체는 반드시 프레임이 부착해서 사용해야한다. // ADD시 확인가능한 COMP(컴포넌트)는 시각적으로 볼 수 있는 모든 클래스의 부모격 클래스를 뜻한다. (BUTTON, PANNEL, LAYOUT등이 해당된다.) f.add(btnOk); f.add(btnClose); // ADAPTER를 통한 우상단 이벤트 처리 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); }; }); f.setVisible(true); } } [예시] :: BUTTON의 이벤트 처리 # 1 ADDACTIONLISTERNER 사용 :: 위 방식은 비슷한 작업 내용의 이벤트 처리에대해서, 하나하나 전부 LISTENER를 지정해줘야한다는 단점이 있다. :: 코드가 복잡해지고 가독성이 떨어진다.

package test; import java.awt.Button; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestMain { public static void main(String[] args) { // Frame f = new Frame(); f.setBounds(600,200,1000,500); f.setLayout(new FlowLayout()); // Button btn1 = new Button("버튼1"); Button btn2 = new Button("버튼2"); Button btn3 = new Button("버튼3"); Button btn4 = new Button("버튼4"); // 부모 프레임이 FLOWLAYOUT으로 설정되어있다면 자식이되는 컴포넌트는 SETSIZE로 변경이 불가능하다. // 이런 경우, SETPREFERREDSIZE를 통해서 수정할 수 있다. btn1.setPreferredSize(new Dimension(200,100)); // 너비, 높이 btn2.setPreferredSize(new Dimension(200,100)); btn3.setPreferredSize(new Dimension(200,100)); btn4.setPreferredSize(new Dimension(200,100)); // f.add(btn1); f.add(btn2); f.add(btn3); f.add(btn4); // # ADD ACTION LISTERNER를 통한 방법 btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("1번 버튼 눌렀음"); } }); btn2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("2번 버튼 눌렀음"); } }); btn3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("3번 버튼 눌렀음"); } }); btn4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("4번 버튼 눌렀음"); } }); // 우상단 종료 버튼 이벤트 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }; }); // f.setVisible(true); } } ​ # 2 ACTION LISTENER 인터페이스 사용

:: 인터페이스의 객체 생성 후 추상 메소드 오버라이딩 중 버튼 처리가 가능하다. :: 대신 감지자를 각각의 버튼에 등록하는 작업이 반드시 있어야한다.

package test; import java.awt.Button; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestMain { public static void main(String[] args) { // Frame f = new Frame(); f.setBounds(600,200,1000,500); f.setLayout(new FlowLayout()); // Button btn1 = new Button("버튼1"); Button btn2 = new Button("버튼2"); Button btn3 = new Button("버튼3"); Button btn4 = new Button("버튼4"); // 부모 프레임이 FLOWLAYOUT으로 설정되어있다면 자식이되는 컴포넌트는 SETSIZE로 변경이 불가능하다. // 이런 경우, SETPREFERREDSIZE를 통해서 수정할 수 있다. btn1.setPreferredSize(new Dimension(200,100)); // 너비, 높이 btn2.setPreferredSize(new Dimension(200,100)); btn3.setPreferredSize(new Dimension(200,100)); btn4.setPreferredSize(new Dimension(200,100)); // f.add(btn1); f.add(btn2); f.add(btn3); f.add(btn4); // ACTION LISTENER 인터페이스를 객체 생성 ActionListener act = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 위의 ACTIONEVENT E 에서 E는 사용자가 클릭한 버튼 (컴포넌트) 그 자체가 된다. // GETACTIONCOMMAND를 통해서 버튼의 제목을 반환받을 수 있다. // 제목이 어떤 것이냐에따라서 버튼마다 다른 행동을 하나의 오버로딩에서 개별적으로 지정할 수 있다. switch (e.getActionCommand()) { case "버튼1": System.out.println("버튼 1번 눌렀음"); break; case "버튼2": System.out.println("버튼 2번 눌렀음"); break; case "버튼3": System.out.println("버튼 3번 눌렀음"); break; case "버튼4": System.out.println("버튼 4번 눌렀음"); break; } } }; // 방식 2번으로 생성한 경우, 각 버튼의 이벤트 감지자를 따로 등록해줘야한다. btn1.addActionListener(act); btn2.addActionListener(act); btn3.addActionListener(act); btn4.addActionListener(act); // 우상단 종료 버튼 이벤트 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }; }); // f.setVisible(true); } } [예시] :: 생성자로, 프레임에서 새로운 프레임으로 이동

# 종료 창에대한 프레임을 설정해둔 TESTEXIT

package test; import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestExit { // Frame f = new Frame(); // public TestExit() { f.setBounds(840, 300, 500, 250); f.setVisible(true); // f.setLayout(null); // Button btn1 = new Button("종료"); Button btn2 = new Button("취소"); // btn1.setBounds(100, 70, 150, 100); btn2.setBounds(260, 70, 150, 100); // f.add(btn1); f.add(btn2); // 각 버튼에대한 이벤트 감지자 등록 btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); // EXIT은 열려있는 모든 프레임을 강제로 종료하는 기능이다. } }); btn2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.dispose(); // DISPOSE는 최종적으로 열려있는 프레임만 종료하는 기능이다, } }); // 우상단의 X버튼 처리 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { f.dispose(); } }); } }

# TESTMAIN package test; import java.awt.Button; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestMain { public static void main(String[] args) { // Frame f = new Frame(); f.setBounds(600,200,1000,500); f.setLayout(new FlowLayout()); // Button btn1 = new Button("버튼1"); Button btn2 = new Button("버튼2"); Button btn3 = new Button("버튼3"); Button btn4 = new Button("종료"); // 부모 프레임이 FLOWLAYOUT으로 설정되어있다면 자식이되는 컴포넌트는 SETSIZE로 변경이 불가능하다. // 이런 경우, SETPREFERREDSIZE를 통해서 수정할 수 있다. btn1.setPreferredSize(new Dimension(200,100)); // 너비, 높이 btn2.setPreferredSize(new Dimension(200,100)); btn3.setPreferredSize(new Dimension(200,100)); btn4.setPreferredSize(new Dimension(200,100)); // f.add(btn1); f.add(btn2); f.add(btn3); f.add(btn4); // 이벤트 감지자 생성 // 2 ACTION LISTENER 인터페이스를 객체 생성하는 방식 ActionListener act = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 위의 ACTIONEVENT E 에서 E는 사용자가 클릭한 버튼 (컴포넌트) 그 자체가 된다. // GETACTIONCOMMAND를 통해서 버튼의 제목을 반환받을 수 있다. // 제목이 어떤 것이냐에따라서 버튼마다 다른 행동을 하나의 오버로딩에서 개별적으로 지정할 수 있다. switch (e.getActionCommand()) { case "버튼1": System.out.println("버튼 1번 눌렀음"); break; case "버튼2": System.out.println("버튼 2번 눌렀음"); break; case "버튼3": System.out.println("버튼 3번 눌렀음"); break; case "종료": TestExit te = new TestExit(); break; } } }; // 방식 2번으로 생성한 경우, 각 버튼의 이벤트 감지자를 따로 등록해줘야한다. btn1.addActionListener(act); btn2.addActionListener(act); btn3.addActionListener(act); btn4.addActionListener(act); // 우상단 종료 버튼 이벤트 f.addWindowListener(new WindowAdapter() { // public void windowClosing(WindowEvent e) { System.exit(0); }; }); // f.setVisible(true); } } [참고] :: EXIT는 모든 프레임의 종료, DIPOSE는 마지막에 오픈된 프레임만 종료한다.

from http://hikr90.tistory.com/51 by ccl(A) rewrite - 2021-12-19 18:27:39