미니 프로젝트<1> 시 프로그램 만들기
- 프로그램 이름은 밀란 쿤데라의 시
- 페이지를 넘기면 밀란 쿤데라의 시를 볼 수 있다.
- 버튼을 클릭하면 다른 프레임이 보이도록 한다.
책 '한권으로 읽는 밀란 쿤데라'를 읽다가 시가 너무 좋아서, 밀란 쿤데라의 시를 읽을 수 있는 프로그램을 만들면 좋을것 같다는 생각이 들었다. 그래서 밀란 쿤데라 시집을 만들기로 결정했다.
메인화면

메인화면은 도화지의 느낌을 살려 구성해보았다.
'밀란 쿤데라의 시'라는 프로그램의 이름과 시작하기, 종료하기 버튼으로 구성되어 있다.
프로그램을 실행하면 메인화면이 나타나도록 하기 위해 생성자 안에 첫번째 프레임을 만든다.
public class Poem {
JFrame frame;
public static void main(String[] args) {
new Poem();
}
public Poem() {
//프레임
frame = new JFrame();
frame.setSize(800,600);
frame.getContentPane().setBackground(Color.white);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setLayout(null);
}
//...이런 식으로
프레임의 크기는 800*600이며, 컨텐트팬안에 색깔을 넣었다. Layout값을 null값으로 해줘야 나중에 패널을 넣었을 때 패널과 색깔이 구분되게 된다.
제목을 넣을 titlePanel과 titleLabel을 만든다.
JLabel은 텍스트를 넣을수 있으며, JPanel로 위치와 크기를 결정하고 패널 안에 레이블을 넣을 것이다.
titlePanel = new JPanel();
titlePanel.setBounds(100, 50, 600, 100);
titlePanel.setBackground(Color.white);
titleLabel = new JLabel("밀란 쿤데라의 시");
titleLabel.setForeground(Color.black);
titleLabel.setFont(titleFont);
titlePanel.add(titleLabel);
'시작하기'버튼과 '종료하기'버튼을 넣기 위해 buttonPanel과 startButton, exitButton을 만든다.
buttonPanel = new JPanel();
buttonPanel.setBounds(100, 300, 600, 100);
buttonPanel.setBackground(Color.white);
startButton = new JButton("시작하기");
startButton.setBackground(Color.white);
startButton.setForeground(Color.black);
startButton.setFont(normalFont);
startButton.setFocusPainted(false); //*클릭했을때 테두리를 없애준다.
exitButton = new JButton("종료하기");
exitButton.setBackground(Color.white);
exitButton.setForeground(Color.black);
exitButton.setFont(normalFont);
exitButton.setFocusPainted(false);
buttonPanel.add(startButton);
buttonPanel.add(exitButton);
마지막에 setVisible(true)를 써줘야 오류없이 작동이 되었다.
frame.add(titlePanel);
frame.add(buttonPanel);
frame.setVisible(true);
폰트의 사용
폰트를 만들어서 적용할 수 있다.
//폰트
Font titleFont = new Font("바탕", Font.BOLD, 70);
Font normalFont = new Font("바탕", Font.BOLD, 20);
제목 부분의 JLable은 titleFont 객체를 만들어서 사용하였고, 버튼에는 normalFont를 적용했다.
titleLabel.setFont(titleFont); //이런식으로 적용한다.
다음으로 버튼을 눌렀을때 액션을 코딩해보겠다.
버튼을 눌렀을때 이벤트를 발생하게 만들기 위해서는 '액션핸들러'를 사용한다.
아래에 다음과 같이 클래스를 만든다.
public class startHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
}
}
이렇게 만든 startHandler를 컴포넌트에 붙이면, 해당 컴포넌트는 startHandler 안에 있는 actionPerformed 함수를 실행하게 된다.
위에서 startHandler 객체를 생성해주고 startButton에 핸들러를 붙인다. addActionListener 키워드를 이용해서 붙일 수 있다.
startHandler startHandler = new startHandler(); //객체 생성
startButton = new JButton("시작하기");
startButton.setBackground(Color.white);
startButton.setForeground(Color.black);
startButton.setFont(normalFont);
startButton.addActionListener(startHandler); //액션핸들러를 붙이는 부분!
startButton.setFocusPainted(false);
종료하는 액션핸들러도 만들어서 붙여준다.
public class exitHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
'시작하기' 버튼을 누르면 첫번째 시 페이지가 나타나게 된다.
여기서 중요한 것은, 중복되는 부분이 무엇인지 알아보는 것이다. 중복되는 틀을 잡고 들어가는 내용만 바꾸는 식으로 프로그램을 짜면 프로그램이 간결해질것이다.
페이지 안에 들어가는 내용은 다음과 같다
- 시의 제목
- 시의 내용
- 이전 버튼, 다음 버튼
그렇기 때문에 mainPage를 만들고, 안에 있는 내용만 setText로 바꾸는 식으로 프로그램을 만들어 볼 것이다.
시의 제목인 poemTitle(JLabel), 시의 내용인 poemContent(JTextArea), 이전버튼과 다음버튼을 뜻하는 backButton, frontButton(JButton) 객체를 선언한다.
위치를 지정하기 위해 poemTitlePanel, poemContentPanel, poemButtonPanel 패널도 만든다.
앞서 만든 titlePanel, buttonPanel은 보이지않게 만들고 패널의 위치와 크기를 지정하고 확인해본다.
public void mainPage() {
titlePanel.setVisible(false);
buttonPanel.setVisible(false);
poemTitlePanel = new JPanel();
poemTitlePanel.setBounds(200, 50, 400, 100);
poemTitlePanel.setBackground(Color.orange);
poemContentPanel = new JPanel();
poemContentPanel.setBounds(100, 160, 600, 300);
poemContentPanel.setBackground(Color.red);
frame.add(poemTitlePanel);
frame.add(poemContentPanel);
}

오렌지 색에는 제목이, 빨간 색에는 내용이 들어갈 것이다.
poemTitle = new JLabel("시의 제목");
poemTitle.setForeground(Color.black);
poemTitle.setFont(normalFont);
poemTitlePanel.add(poemTitle);
poemContent = new JTextArea("시의 내용을 적는 공간입니다.\n시의 내용을 적는 공간입니다.\n시의 내용을 적는 공간입니다.\n");
poemContent.setForeground(Color.black);
poemContent.setFont(normalFont);
poemContentPanel.add(poemContent);

오렌지와 레드 컬러는 화이트 컬러로 바꿔주고, 버튼까지 넣어주면 다음과 같다

시는 총 다섯편으로 구성할 생각이다.
페이지 구성은 다음과 같다.
firstPage, secondPage, thirdPage, fourPage, fivePage
해당 페이지에서 다음 버튼을 누를경우 그 다음 페이지로 이동한다.
예를 들어 secondPage 에서 다음 버튼을 누르면 thirdPage로 이동한다.
해당 페이지에서 이전 버튼을 누를 경우 이전 페이지로 이동한다.
secondPage 에서 이전 버튼을 누르면 firstPage 로 이동한다.
public class frontHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
}
}
}
public class backHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
}
}
}
이전 버튼과 다음 버튼에 붙일 핸들러를 만들고 객체를 생성한다음, 버튼에 핸들러를 붙인다.
- frontButton → frontHandler를 addActionListener로 붙임
- backButton → backHandler를 addActionListener로 붙임
첫번째 페이지이다.
public void firstPage() {
position = "firstPage";
poemTitle.setText("시인이 된다는 것");
poemContent.setText("시인이 된다는 것은\n끝까지 가보는 것을 의미하지.\n행동의 끝까지\n희망의 끝까지\n열정의 끝까지\n절망의 끝까지.");
}
setText로 미리 만들어두었던 mainPage의 내용만 바뀌도록 한다.
mainPage 함수 마지막에 firstPage()로 이동하도록 하였고, startButton을 누르면 자동으로 mainPage → firstPage로 이동하게 된다.
public class startHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
mainPage();
}
}

여기서 다음 버튼을 누르면 secondPage()가 나오게 한다.
String으로 각 함수마다 이름을 저장해두고, 액션리스너 안에서 해당 이름을 가져와서 사용하도록 만들었다.
public void secondPage() {
position = "secondPage";
poemTitle.setText("밤중에");
poemContent.setText("밤이 오면 뜰의 대문이 닫힌다.\n문들이 닫힌다\n데이지 꽃은 하얀 꽃잎으로 머리를\n감싸고 잠드나니.");
}
이렇게 해당 함수에 position 이라는 String 변수를 이용해서 이름을 만들고
public class frontHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
switch(position) {
case "firstPage": secondPage(); break;
case "secondPage": thirdPage(); break;
}
}
}
액션핸들러의 switch문에 position으로 연결해서 사용하는 것이다
switch 안에는 데이터이름, case 안에는 데이터 내용이 들어간다.
두번째, 세번째,네번째, 다섯번째 페이지를 만든다.
public void firstPage() {
position = "firstPage";
poemTitle.setText("시인이 된다는 것");
poemContent.setText("시인이 된다는 것은\n끝까지 가보는 것을 의미하지.\n행동의 끝까지\n희망의 끝까지\n열정의 끝까지\n절망의 끝까지.");
}
public void secondPage() {
position = "secondPage";
poemTitle.setText("밤중에");
poemContent.setText("밤이 오면 뜰의 대문이 닫힌다.\n문들이 닫힌다\n데이지 꽃은 하얀 꽃잎으로 머리를\n감싸고 잠드나니.");
}
public void thirdPage() {
position = "thirdPage";
poemTitle.setText("밀란 쿤데라의 [불멸] 중에서");
poemContent.setText("산다는 것, 거기에는 어떤 행복도 없다.\n\n하지만 존재, 존재한다는 것은 행복이다.");
}
public void fourPage() {
position = "fourPage";
poemTitle.setText("할머니");
poemContent.setText("브르노 너머 들판에서 아침이 요동쳤다.\n마치 누군가가 하늘을 파랗게 물들인 것처럼.\n"
+ "나는 바다를 걸어간 성프란체스코 성인처럼\n뿌연 먼기를 내며 걸어오는 할머니를 보았다.\n"
+ "그녀는 계속 그렇게 걸어갔다.\n쾌쾌한 해 묵은 옷을 걸친 채.");
}
public void fivePage() {
position = "fivePage";
poemTitle.setText("그건 사랑이 아니야");
poemContent.setText("삶의 무게에 짓눌려\n난 부서지고 파멸되고 있어.\n그런데 당신은 마치 장갑이나 짜듯 태평히\n"
+ "난로 앞에 앉아 삶이라는 것을 짜집기하고 있지.\n이건 사랑이 아니야!");
}
이전 버튼, 다음 버튼 완성하기
public class backHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
switch(position) {
case "firstPage": fivePage(); break;
case "secondPage": firstPage(); break;
case "thirdPage": secondPage(); break;
case "fourPage": thirdPage(); break;
case "fivePage": fourPage(); break;
}
}
}
public class frontHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
switch(position) {
case "firstPage": secondPage(); break;
case "secondPage": thirdPage(); break;
case "thirdPage": fourPage(); break;
case "fourPage": fivePage(); break;
case "fivePage": firstPage(); break;
}
}
}
이렇게 완성되었다!





다음 버튼을 누르면 1>2>3>4>5>1 순으로 이동하며
이전 버튼을 누르면 1>5>4>3>2>1 순으로 이동한다
'미니 프로젝트' 카테고리의 다른 글
| 미니 프로젝트<2> 5가지 사랑의 언어 (8) | 2021.07.13 |
|---|