▶ 경로 지정
- 외부로부터 이미지나 음악 파일 등을 불러올 때 항상 경로를 지정해야 한다.
- 경로를 지정하는 방식은 상대경로, 절대경로 두 가지가 있다.
- 상대경로 : 현재 위치한 곳을 기준으로 경로를 지정하는 방식인데, 소스파일이 있는 프로젝트 디렉토리 내에 외부 파일이 있다면 이미지 파일이름만 지정해도 된다.
ex) C:\users 위치에 A폴더와 Image폴더가 있고, A 폴더 안에 소스파일이, Image 폴더에 이미지 파일이 있다면, 해당 이미지 파일을 가져오기 위해 소스파일이 있는 A폴더 위치를 기준으로
- 상대경로를 지정하는데 몇 가지 규칙이 존재한다.
\ : 루트 디렉토리 ex) C:
.\ : 소스를 적고 있는 파일의 위치 ex) C:\users\A
..\ : 소스파일을 포함하는 상단 폴더가 있는 위치 ex) C:\users (해당 경로의 디렉토리에는 A폴더와 Image 폴더가 있다.)
“.\Image\이미지파일명“ 라고 지정하면 된다.
- 보통 Toolkit 객체를 통해 이미지 파일을 얻는다.
Image img = Toolkit.getDefaultToolkit().getImage(“.\Image\이미지파일명”);
(getDefaultToolkit() 메소드는 Toolkit 객체를 반환한다. 무조건 이렇게 객체를 얻어야함.)
- 절대경로 : 웹사이트의 URL 주소, 컴퓨터에서 파일이 있는 위치
ex)
C:\Program Files\Java\jdk1.8.0_131
- 절대경로를 지정하기 위해 자바에서는 다양한 메소드가 제공된다.
A 클래스의 디렉토리에 Image 폴더가 있고, 해당 폴더 안의 이미지를 구한다면, A 클래스의 디렉토리에 접근하고자 “A.class.getResource(“”).getPath();“ 를 사용하면 된다.
결론적으로 아래의 방법을 통해 폴더 안의 이미지 파일의 절대 위치를 얻게 되는 것이다.
String imgPath = A.class.getResource("").getPath() + "\Image\이미지파일명";
- Toolkit 객체에 절대 경로를 넣는 방법도 있다.
Image img = Toolkit.getDefaultToolkit().getImage("C:\users\Image\이미지파일명");
▶ 이미지 표시하기
- 거의 모든 스윙 컴포넌트에는 텍스트 옆에 이미지를 표시하거나 레이블(JLabel), 버튼(JButton)에도 이미지를 표시할 수 있다.
- 이미지를 얻으려면 Image 객체 또는 ImageIcon 객체를 생성해야 한다. 위에서 Image 객체를 얻는 방법을 위에 설명했으니 ImageIcon 객체를 통해 이미지를 얻는 방법을 살펴볼건데, 실제로 레이블과 버튼의 아이콘 설정(setIcon)을 할 때, ImageIcon 객체를 매개변수로 넘겨야 한다.
ImageIcon img = new ImageIcon("절대경로 또는 상대경로").getImage();
- 이미지 파일의 경로가 지정되지 않고 파일 이름만 줄 경우, 프로젝트 디렉토리 내에 파일이 있는 것으로 가정된다.
ImageIcon img = new ImageIcon("image.png").getImage();
JLabel label = new JLabel();
label.setIcon(img);
//또는
JLabel label = new JLabel(img);
▶ 체크 박스
- JCheckBox 클래스란 사용자가 클릭하여 체크 상태 여부를 결정하는 일종의 컨트롤이다.s
JCheckBox | ||
생성자 | JCheckBox() | 텍스트가 없는 Checkbox를 생성한다. (체크하는 네모칸만 존재한다.) |
JCheckBox(String text) | 지정된 텍스트의 Checkbox를 생성한다. | |
JCheckBox(String text, boolean selected) | 체크 여부와 지정된 텍스트를 가지는 Checkbox를 생성한다. | |
메소드 | String getText() | 체크박스에 표시되는 텍스트를 가져온다. |
Boolean isSelected() | 체크박스의 표시유무를 반환한다. | |
void setSelected(boolean value) | 체크박스의 표시유무를 설정한다. | |
void setText(String text) | 체크박스의 텍스트를 설정한다. |
- 사용자가 체크박스를 선택하면 ItemEvent가 발생하며, 이벤트를 처리하려면 ItemListener 인터페이스를 구현해야 한다.
public class CheckboxExample implements ItemListener {
//FIELDS
JCheckBox check = new JCheckBox(“checkbox1”);
//CONSTRUCTOR
CheckBoxExample() {
check.addItemListener(this);
}
//METHODS
@Override
public void itemStateChanged(ItemEvent e) {
//체크박스의 아이템 이벤트를 처리한다. 체크박스의 상태가 변경될 때마다 호출됨.
String changeText = “changeCheck!”;
Object source = e.getItemSelectable(); //선택된 체크박스를 얻는다.
if(source == check) {
if(e.getStateChange() == ItemEvent.DESELECTED) //체크가 해제되었다면,
check.setText(“checkbox1”);
} else {
check.setText(changeText);
}
}
}
▶ 라디오 버튼
- 라디오 버튼은 체크박스와 비슷하지만 하나의 그룹 안에서는 한 개의 버튼만 선택할 수 있다는 점에서 차이가 있다.
- 그룹으로 묶인 라디오 버튼들은 하나만 선택될 수 있고, 나머지는 모두 해제된 상태를 유지한다.
- 라디오 버튼을 만들기 위해서는 JRadioButton 클래스와 ButtonGroup 클래스를 선언해야 한다. ButtonGroup 클래스는 버튼들을 그룹핑하는 데 사용된다.
- 라디오 버튼의 모든 사용법은 앞의 체크박스와 유사하다.
JRadioButton | ||
생성자 | JRadioButton(String text) | 지정된 텍스트의 라디오 버튼을 생성한다. |
JRadioButton(String text, boolean selected) | 초기 상태와 지정된 텍스트를 가진 라디오 버튼을 생성한다. |
ButtonGroup | ||
생성자 | ButtonGroup() | 버튼을 그룹핑 하는 버튼 그룹 객체를 생성한다. |
메소드 | void add(AbstractButton b) | 매개변수로 넘겨받은 버튼을 그룹핑에 추가한다. |
void clearSelect() | 모든 버튼의 선택을 해제한다. | |
int getButtonCount() | 그룹핑된 버튼의 개수를 반환한다. | |
ButtonModel getSelection() | 선택된 버튼의 종류를 반환한다. | |
boolean isSelected(ButtonModel m) | 매개변수로 넘겨받은 버튼의 선택 유무를 반환한다. | |
void remove(AbstractButton b) | 매개변수로 넘겨받은 버튼을 그룹핑에서 제외시킨다. | |
void setSelected(ButtonModel m, boolean selected) | 지정된 버튼의 선택유무를 설정한다. |
...
JRadioButton radioBtn1 = new JRadioButton(“RadioButton1”);
JRadioButton radioBtn2 = new JRadioButton(“RadioButton2”);
JRadioButton radioBtn3 = new JRadioButton(“RadioButton3”);
ButtonGroup grouping = new ButtonGroup();
grouping.add(radioBtn1);
grouping.add(radioBtn2);
grouping.add(radioBtn3);
//세 버튼 중 하나만 선택된다.
▶ 경계 만들기
- 경계(Border)란 시각적으로 컴포넌트들을 그룹핑할 때 사용하는 장식적인 요소이다.
- 일반적으로 체크박스나 라디오 버튼을 그룹핑할 때 함께 사용한다.
- 경계를 생성하기 위해 BorderFactory 클래스의 정적 메소드를 활용한다.
- 경계 객체를 생성한 뒤, 컴포넌트를 추가한 패널(JPanel)의 setBorder()메소드를 통해 설정하면 된다.
BorderFactory | |
메소드 | 설명 |
Border createLineBorder(Color color) | 직선으로 된 경계를 생성한다. 매개변수로 받은 Color 객체는 선의 색상을 결정한다. |
Border createLineBorder(Color c, int w) | 두 번째 매개변수는 선의 폭을 결정하며, 단위는 픽셀이다. |
TitleBorder createTitledBorder(String t) | 제목이 붙여진 경계를 생성한다. 문자열 매개변수가 제목을 나타낸다. |
public class MyFrame extends Frame { //리스너를 설정하지 않은 상태..!
//FIELDS
JPanel panel = new JPanel();
JRadioButton btn1 = new JRadioButton(“btn1”);
JRadioButton btn2 = new JRadioButton(“btn2”);
JRadioButton btn3 = new JRadioButton(“btn3”);
ButtonGroup group = new ButtonGroup(); //버튼 그룹핑
Border border = BorderFactory.createTitled(“버튼들”);
//CONSTRUCTOR
MyFrame() {
panel.setBorder(border);
group.add(“btn1”);
group.add(“btn2”);
group.add(“btn3”);
panel.add(“btn1”); //패널에 버튼 추가 (추가해야 보입니다.)
panel.add(“btn2”);
panel.add(“btn3”);
//Frame의 디폴트 레이아웃은 BorderLayout이므로 중간에 설정하면, 패널의 경계를 기준으로 경계 안에 버튼들이 있을 겁니다.
add(panel, BorderLayout.CENTER);
}
}
'Programming Language > JAVA' 카테고리의 다른 글
24. JScrollPane - 스크롤 페인 (0) | 2017.06.25 |
---|---|
23. JTextComponent (JTextField, JTextArea, JPasswordField) - 텍스트 컴포넌트 (텍스트 영역, 텍스트 필드, 패스워드 필드) (0) | 2017.06.25 |
21. JComponent Class - 스윙의 최상위 컴포넌트 클래스 (0) | 2017.05.26 |
20. ComponentEvent, ContainerEvent, FocusEvent, WindowEvent - 컴포넌트 이벤트, 컨테이너 이벤트, 포커스 이벤트, 윈도우 이벤트 (0) | 2017.05.26 |
19. ActionEvent, KeyEvent, MouseEvent - GUI에서 잘 쓰이는 이벤트 (0) | 2017.05.26 |