Question 1.
JLabel 컴포넌트는 Mouse 이벤트를 받을 수 있다. JLabel 컴포넌트의 초기 문자열을 “자기야”라고 출력하고, 레이블에 마우스를 올리면 “사랑해”로, 내리면 “자기야”가 다시 출력되도록 프로그램을 작성하라.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question1 extends JFrame {
public Question1() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JLabel label = new JLabel("자기야");
label.addMouseListener(new MouseListener() {
public void mouseEntered(MouseEvent e) {
label.setText("사랑해");
}
public void mouseExited(MouseEvent e) {
label.setText("자기야");
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
});
c.add(label);
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new Question1();
}
}
Question 2.
프레임의 컨텐트팬의 초기 색을 Color.CYAN으로 하고, R 키를 누르는 순간 배경색이 Color.RED 색으로 변했다가, 키를 떼면 다시 초기 색으로 돌아오는 프로그램을 작성하라.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question2 extends JFrame {
public Question2() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setBackground(Color.CYAN);
c.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if(e.getKeyChar() == 'R') {
c.setBackground(Color.RED);
}
}
public void keyReleased(KeyEvent e) {
c.setBackground(Color.CYAN);
}
public void keyTyped(KeyEvent e) {}
});
this.setSize(300, 300);
this.setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Question2();
}
}
Question 3.
컨텐트팬의 배경색은 초록색(Color.GREEN)으로 하고, 마우스의 드래깅 동안만 노란색(Color.YELLOW)으로 나타나는 프로그램을 작성하라. 드래깅을 멈추면 초록색이 된다.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question3 extends JFrame {
public Question3() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setBackground(Color.GREEN);
c.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent e) {
c.setBackground(Color.GREEN);
}
public void mousePressed(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
c.addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
c.setBackground(Color.YELLOW);
}
public void mouseMoved(MouseEvent e) {}
});
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new Question3();
}
}
Question 4.
JLabel 컴포넌트를 이용하여 “Love Java”를 출력하고, + 키를 치면 폰트 크기를 5픽셀씩 키우고, - 키를 치면 폰트 크기를 5픽셀씩 줄이는 스윙 응용프로그램을 작성하라. 5픽셀 이하로 작아지지 않도록 하라.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question4 extends JFrame {
private Font f;
private int size;
public Question4() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JLabel label = new JLabel("Love Java");
c.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
f = label.getFont();
size = f.getSize();
if(e.getKeyChar() == '+') {
label.setFont(new Font("Arial", Font.PLAIN, size + 5));
}
else if(e.getKeyChar() == '-' && size > 10) {
label.setFont(new Font("Arial", Font.PLAIN, size - 5));
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
});
c.add(label);
this.setSize(300, 300);
this.setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Question4();
}
}
Question 5.
클릭 연습용 스윙 응용프로그램을 작성하라. JLabel을 이용하여 문자열 “C”인 레이블을 하나 만들고 초기 위치를 (50, 50)으로 하라. 문자열을 클릭할 때마다 레이블은 프레임 내의 랜덤한 위치로 움직인다.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question5 extends JFrame {
private int x, y;
public Question5() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setLayout(null);
JLabel label = new JLabel("C");
label.setBounds(50, 50, 40, 40);
label.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
x = (int)(Math.random()*(getContentPane().getWidth() - label.getWidth()));
y = (int)(Math.random()*(getContentPane().getHeight() - label.getHeight()));
label.setLocation(x, y);
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
c.add(label);
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new Question5();
}
}
Question 6.
GridLayout을 이용하여 컨텐트팬에 숫자를 담은 JLabel을 12개를 부착하고, 초기 바탕색을 모두 Color.WHITE 색으로 한다. 그리고 각 레이블 위에 마우스로 클릭하면 랜덤한 색으로 채워지도록 프로그램을 작성하라. 랜덤한 색을 만드는 방법은 예제 9-6의 코드를 참고하라.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question6 extends JFrame {
private JLabel label[] = new JLabel[12];
private int r, g, b;
public Question6() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new GridLayout(4, 3));
for(int i = 0; i < 12; i++) {
label[i] = new JLabel(Integer.toString(i));
label[i].setBackground(Color.WHITE);
label[i].addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
JLabel la = (JLabel)e.getSource();
r = (int)(Math.random()*256);
g = (int)(Math.random()*256);
b = (int)(Math.random()*256);
la.setOpaque(true);
la.setBackground(new Color(r, g, b));
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
c.add(label[i]);
}
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new Question6();
}
}
Question 7.
임의의 정수에 주어진 연산을 조합하여 0을 만드는 게임을 작성해보자. 화면에는 1에서 60사이의 임의의 정수가 출력되고, 그 밑에 “+2” 버튼, “-1” 버튼, “%4” 버튼의 세 버튼을 출력하라. 그리고 이들 버튼을 누르면 정수에 ‘더하기 2’, ‘빼기 2’, ‘4로 나눈 나머지’를 각각 계산하여 정수를 수정하라. 사용자가 각 버튼을 한 번씩만 누를 수 있도록 누른 버튼은 모두 비활성화시켜라. 버튼을 눌러서 정수가 0이 되면 처음부터 시작하도록 하라.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question7 extends JFrame {
private JLabel label;
public Question7() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(new FirstPanel(), BorderLayout.NORTH);
c.add(new SecondPanel(), BorderLayout.SOUTH);
this.setSize(300, 200);
this.setVisible(true);
}
private class FirstPanel extends JPanel {
public FirstPanel() {
setLayout(new FlowLayout());
label = new JLabel(Integer.toString((int)(Math.random()*59)+1));
label.setFont(new Font("Arial", Font.PLAIN, 30));
add(label);
}
}
private class SecondPanel extends JPanel {
public SecondPanel() {
setLayout(new FlowLayout());
JButton [] btn = new JButton[3];
btn[0] = new JButton("+2");
btn[1] = new JButton("-1");
btn[2] = new JButton("%4");
for(int i = 0; i < 3; i++) {
btn[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if(b == btn[0]) {
label.setText(Integer.toString(Integer.parseInt(label.getText()) + 2));
btn[0].setEnabled(false);
if(btn[1].isEnabled() == false && btn[2].isEnabled() == false) {
setTitle("실패");
}
}
else if(b == btn[1]) {
label.setText(Integer.toString(Integer.parseInt(label.getText()) - 1));
btn[1].setEnabled(false);
if(label.getText().equals("0")) {
new Question7();
dispose();
}
else if(btn[0].isEnabled() == false && btn[2].isEnabled() == false) {
setTitle("실패");
}
}
else if(b == btn[2]) {
label.setText(Integer.toString(Integer.parseInt(label.getText()) % 4));
btn[2].setEnabled(false);
if(label.getText().equals("0")) {
new Question7();
dispose();
}
else if(btn[0].isEnabled() == false && btn[1].isEnabled() == false) {
setTitle("실패");
}
}
}
});
add(btn[i]);
}
}
}
public static void main(String[] args) {
new Question7();
}
}
Bonus Question 1.
JLabel을 활용하여 “Love Java”를 출력하고, “Love Java” 글자 위에 마우스를 올려 마우스 휠을 위로 굴리면 글자가 작아지고, 아래로 굴리면 글자가 커지도록 프로그램을 작성하라. 폰트 크기는 한 번에 5픽셀씩 작아지거나 커지도록 하고, 5픽셀 이하로 작아지지 않도록 하라.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BonusQuestion1 extends JFrame{
private Font f;
private int size;
public BonusQuestion1() {
this.setTitle("Java");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JLabel label = new JLabel("Love Java");
label.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
f = label.getFont();
size = f.getSize();
int n = e.getWheelRotation();
if(n < 0 && size > 10) {
label.setFont(new Font("Arial", Font.PLAIN, size - 5));
}
else {
label.setFont(new Font("Arial", Font.PLAIN, size + 5));
}
}
});
c.add(label);
this.setSize(300, 200);
this.setVisible(true);
}
public static void main(String args[]) {
new BonusQuestion1();
}
}
Bonus Question 2.
간단한 계산기를 만들어보자. 아래 그림과 같이 여러 버튼들이 있고, 숫자 버튼과 연산자 버튼을 눌러 계산식을 만든 후 계산 버튼을 누르면 결과를 출력한다. 코딩의 난이도를 낮추기 위해 한 번에 하나의 연산만 처리하도록 작성하라. 예를 들어 2+3×4와 같이 두 개 이상의 연산자가 들어 있는 계산은 처리하지 않아도 된다.
코드
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Calculator extends JFrame {
private JButton [] btn = new JButton[16]; // 버튼
private JTextField firstTextfield = new JTextField(10); // 첫 번째 텍스트 필드
private JTextField secondTextfield = new JTextField(10); // 두 번째 텍스트 필드
private int [] changeOperand = new int[10]; // 제곱 함수를 이용해서 두번째 피연산자를 처리하기 위한 배열
private int firstOperand = 0; // 첫 번째 피연산자
private int secondOperand = 0; // 두 번째 피연산자
private char operator; // 연산자
public Calculator() {
this.setTitle("간단한 계산기");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
Container c = getContentPane();
c.setLayout(new BorderLayout(3, 3));
c.add(new FirstPanel(), BorderLayout.NORTH);
c.add(new SecondPanel());
this.setSize(300, 300);
this.setVisible(true);
}
private class FirstPanel extends JPanel { // 첫 번째 패널 생성
public FirstPanel() {
setBackground(Color.GRAY);
setLayout(new FlowLayout());
add(new JLabel("수식"));
add(firstTextfield);
firstTextfield.setEditable(false); // 사용자가 키보드로 직접 입력할 수 없도록 처리
add(new JLabel("결과"));
add(secondTextfield);
secondTextfield.setEditable(false); // 사용자가 키보드로 직접 입력할 수 없도록 처리
}
}
private class SecondPanel extends JPanel { // 두 번째 패널 생성
public SecondPanel() {
setLayout(new GridLayout(4, 4, 5, 5));
for(int i = 0; i < 10; i++) {
btn[i] = new JButton(Integer.toString(i));
btn[i].addActionListener(new MyActionListener());
add(btn[i]);
}
JButton btn_ce = new JButton("CE");
JButton btn_calc = new JButton("계산");
JButton btn_add = new JButton("+");
JButton btn_sub = new JButton("-");
JButton btn_mul = new JButton("x");
JButton btn_div = new JButton("/");
btn_ce.addActionListener(new MyActionListener());
btn_calc.addActionListener(new MyActionListener());
btn_add.addActionListener(new MyActionListener());
btn_sub.addActionListener(new MyActionListener());
btn_mul.addActionListener(new MyActionListener());
btn_div.addActionListener(new MyActionListener());
btn_add.setBackground(Color.CYAN);
btn_sub.setBackground(Color.CYAN);
btn_mul.setBackground(Color.CYAN);
btn_div.setBackground(Color.CYAN);
add(btn_ce);
add(btn_calc);
add(btn_add);
add(btn_sub);
add(btn_mul);
add(btn_div);
}
}
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton btn = (JButton)e.getSource();
int index = 0;
// changeOperand 배열의 순서를 확인하기 위해 사용할 변수
if(btn.getText().equals("CE")) { // 계산과 관련된 모든 변수 초기화
firstTextfield.setText("");
secondTextfield.setText("");
firstOperand = 0;
secondOperand = 0;
}
else if(btn.getText().equals("계산")) {
String str = firstTextfield.getText();
for(int i = firstTextfield.getText().length()-1; i >= 0; i--) {
char c = str.charAt(i);
// 첫 번째 텍스트 필드에 저장되어 있는 문자를 뒤에서 부터 하나씩 읽어들임(두 번째 피연산자를 찾기 위함)
if(c == '+' | c == '-' | c == 'x' | c == '/') {
operator = c;
break;
}
// 연산자를 기준으로 오른쪽 텍스트가 피연산자이기 때문에 연산자를 찾으면 더 이상 루프를 돌 필요가 없음
else {
changeOperand[index] = Integer.parseInt(Character.toString(c));
secondOperand += changeOperand[index]*(Math.pow(10, index));
// 제곱 함수를 사용해서 두 번째 피연산자 처리
index++;
}
}
switch(operator) {
case '+':
secondTextfield.setText(Float.toString(firstOperand + secondOperand));
break;
case '-':
secondTextfield.setText(Float.toString(firstOperand - secondOperand));
break;
case 'x':
secondTextfield.setText(Float.toString(firstOperand * secondOperand));
break;
case '/':
secondTextfield.setText(Float.toString(firstOperand / secondOperand));
break;
}
}
else if(btn.getText().equals("+") | btn.getText().equals("-") | btn.getText().equals("x") | btn.getText().equals("/")) {
// 텍스트 필드에 연산자가 입력되면 이전에 입력되었던 텍스트들을 첫 번째 피연산자로 firstOperand 변수에 저장
firstOperand = Integer.parseInt(firstTextfield.getText());
switch(btn.getText()) {
case "+":
firstTextfield.setText(firstTextfield.getText() + "+");
break;
case "-":
firstTextfield.setText(firstTextfield.getText() + "-");
break;
case "x":
firstTextfield.setText(firstTextfield.getText() + "x");
break;
case "/":
firstTextfield.setText(firstTextfield.getText() + "/");
break;
}
}
else {
for(int i = 0; i < 10; i++) {
if(btn.getText().equals(Integer.toString(i))) {
firstTextfield.setText(firstTextfield.getText() + Integer.toString(i));
}
}
}
}
}
public static void main(String args[]) {
new Calculator();
}
}
'☕ Java > 명품 자바 에센셜' 카테고리의 다른 글
명품 자바 에센셜 11장 실습 문제 (0) | 2019.05.22 |
---|---|
명품 자바 에센셜 10장 실습 문제 (0) | 2019.05.21 |
명품 자바 에센셜 8장 실습 문제 (0) | 2019.05.13 |
명품 자바 에센셜 7장 실습 문제 (0) | 2019.05.12 |
명품 자바 에센셜 6장 실습 문제 (0) | 2019.05.11 |