본문 바로가기

java

Step14_Swing (JFrame, JButton, ActionListener, 문자열 비교)

 

 

JFrame 메소드

 

setBounds

GUI 창의 위치와 크기를 조절해준다.

setDefaultCloseOperation

창을 닫았을때 프로세스도 같이 종료 되되록 한다.

setLayout

레이아웃 매니저

setVisible

프레임이 화면상에 보이도록 한다.

 

JButton 메소드

 

setLocation

버튼의 위치

setSize

버튼의 크기

setBounds

setLocation,setSize를 한번에 설정할 수 있는 메소드

 

 

frame01~04 (JFrame, JButton의 기본 형식, setLayout 차이)

 

위와 같은 메소드들을 사용할 수 있는 이유는 MyFrame이 JFrame을 상속받았기 때문이다. 예시에서는 메소드 앞에 this.이 생략되어 있는 것이며 this. 을 사용해서 JFrame의 다른 메소드들도 호출할 수 있다.

 

EXIT_ON_CLOSE

JFrame.이 생략된 것으로 JFrame의 static final field가 생략된 것이다.

 

 

 

JButton이 component 를 상속받기 때문에 component type의 인자로 전달이 가능하다.

 

 

setLayout 사용하기

null FlowLayout GridLayout BorderLayout
setLayout(null); setLayout(new FlowLayout(FlowLayout.CENTER)); setLayout(new GridLayout(2, 2)); setLayout(new BorderLayout());

 

setLayout(null);

setLayout(new FlowLayout(FlowLayout.CENTER));

setLayout(new GridLayout(2, 2));

setLayout(new BorderLayout());

 

BorderLayout은 버튼의 위치도 작성해야한다.

 

 

frame05

생성자 내용을 main 메소드에 담기

ActionListener로 버튼을 동작하기

 

옮기기 전
옮긴 후

 

지역변수에 담아 main 메소드에서 실행하도록 할 수도 있다. 예시에서는 지역변수 f에 담아 사용했다.

 

 

1. ActionListener import 한 뒤 객체로 만들었다.

2. ActionListener 의 추상 메소드인 actionPerformed를 사용해서 버튼을 클릭할때 동작할 수 있게 코드를 작성했다.

3. JOptionPane을 import 해서 JOptionPane.showMessageDialog로 메시지 창을 만들었다.

 

 

ActionListener는 추상메소드 하나를 가지고 있다.

 

이때 확인해 볼 수 있는 것이 ActionListener가 actionPerformed 추상 메소드 하나만을 가지고 있다는 것이다.

따라서 함수 형태로 만들 수 있다.

 

공통.

JButton deleteBtn=new JButton("삭제");
add(deleteBtn);

 

1. deleteBtn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {          
        JOptionPane.showMessageDialog(MyFrame.this, "삭제 합니다.");       
    }
});

 

2. ActionListener dListener=(ActionEvent e)-> {
    JOptionPane.showMessageDialog(MyFrame.this, "삭제합니다!");
};

 

예시에서는 2번 방식으로 작성했다. 원래는 ActionListener()를 객체 생성해서 변수에 넣어 사용하거나 1번 방식과 같이 일회성으로 사용하는 방법도 있다. 다만 ActionListener가 추상메소드를 하나만 가지고 있기에 함수 표현식을 사용할 수 있는 것이다.

 

 

frame06

ActionListener를 구현(implements ) 해서 사용하기

getSource(), getActionCommand()

 

ActionListener를 구현(implements ) 해서 사용하기

여기서 ActionListener가 interface기 때문에 implements 해서 사용하는 방법도 있다.

ActionListener를 구현하고 코드를 작성하면 익명클래스를 만들거나 외부 클래스를 따로 만들지 않아도 this로 간단하게 인자로 사용하고 메소드를 사용할 수 있다.

 

getSource(), getActionCommand() 사용해서 버튼마다 다른 동작을 하도록 작성하기

public void actionPerformed(ActionEvent e) {

    JOptionPane.showMessageDialog(this, "전송 합니다.");

    JOptionPane.showMessageDialog(this, "삭제 합니다.");

}

이렇게 코드를 작성하면 어떤 버튼을 누르더라도 "전송 합니다.","삭제 합니다." showMessageDialog창이 뜬다.

getSource(), getActionCommand() 사용해서 버튼마다 다른 동작을 하도록 작성하려고 하는데 모범답안부터 확인해보자.

 

getSource() 사용

getSource 예시 (객체 생성하기 전에 필드에서 변수를 만들어 놓은 코드)

 

생성자 외의 메소드에서도 사용하기 위해 객체를 생성하기 전에 필드에서 변수를 미리 만들어 놓는 것으로 수정했다.

 

getSource 예시

 

getSource는 객체 타입으로 참조값을 리턴해준다. 때문에 if else 문을 사용할때 객체 타입을 가져와서 비교를 해야한다.

이때를 위해 생성자에서 만들 객체의 변수를 필드에 미리 만들어두는 수정 작업을 한 것이다.

 

getActionCommand() 사용

 

getActionCommand 선생님 예시 (생성자에 setActionCommand 사용)

 

getActionCommand() 사용시 문자열 비교를 하기 때문에 위와 같은 필드작업은 필요하지 않다.

현재 상황에서는 setActionCommand()을 사용하지 않아도 작동하지만 추후의 발전된 코딩을 위해 setActionCommand()을 사용했다.

 

getActionCommand 선생님 예시

 

getActionCommand()를 사용하면 setActionCommand()로 변경했던 문자열이 출력되거나 setActionCommand()를 사용하지 않았다면 기존의 문자열이 출력된다. 이때 ==연산자를 사용하면 참조값을 비교한다. 문자열의 내용이 같을때 참조값이 같을때도 있지만 아닐때도 있기 때문에 연산을 신뢰할 수 없게 된다. 그래서 String 객체의 메소드인 .equals()  활용하였다.

 

getActionCommand. 필자작성 예시 (작동은 되지만 틀림)

 

필자가 작성한 예시는 필드 수정, setActionCommand, equals 모두 활용하지 않았다. 틀린 이유는 ==연산자를 사용해서이다. equals만 사용했어도 정확한 예시가 됬을 것이다.

 

[문자열 비교에 대해서]

 

== 연산자는 내용이 아닌 참조값을 비교하는 연산자이다.

 

문자열의 내용이 같을때 참조값이 같을때도 있고 아닐때도 있다.

결론은 문자열의 내용을 비교할때 == 을 사용하면 안된다.

비교하는 방법은 String 객체의 .equals() 메소드를 활용하면 된다.