[명품 Java] 11장 실습문제 (기본적인 스윙 컴포넌트와 활용)
2021. 12. 21. 18:56ㆍSolution`/Java
[11장 1번]
아래 그림과 같이 2개의 체크박스와 버튼을 하나 만들어라. "버튼 비활성화" 박스를 선택하면 버튼이 작동하지 못하게 하고, 해제하면 다시 작동하게 하라. "버튼 감추기" 체크박스를 선택하면 버튼이 보이지 않도록 하고 해제하면 버튼이 보이도록 하라.
package Java11_1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class Java11_1 extends JFrame{
Java11_1(){
super("CheckBox Practice Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JCheckBox ck1 = new JCheckBox("버튼 비활성화");
JCheckBox ck2 = new JCheckBox("버튼 감추기");
JButton btn = new JButton("test button");
c.add(ck1); c.add(ck2); c.add(btn);
ck1.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)
btn.setEnabled(false);
else
btn.setEnabled(true);
}
});
ck2.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)
btn.setVisible(false);
else
btn.setVisible(true);
}
});
setSize(300, 200);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Java11_1();
}
}
[11장 2번]
실행 예시와 같이 JComboBox로 빈 콤보박스로 만들고, JTextField 입력 창에 문자열을 입력하고 <Enter> 키를 입력하면 문자열을 콤보박스의 아이템으로 삽입하라.
package Java11_2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Java11_2 extends JFrame {
Java11_2(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JTextField tf = new JTextField(16);
JComboBox<String> cb = new JComboBox<String>();
c.add(tf); c.add(cb);
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JTextField jft = (JTextField)e.getSource();
cb.addItem(jft.getText());
jft.setText("");
}
});
setSize(400, 400);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Java11_2();
}
}
[11장 3번]
다음과 같은 화면을 구성하고 금액을 입력한 후 버튼을 클릭하면 오만원권, 만원권, 천원권, 500원짜리 동전, 100원짜리 동전, 50원짜리 동전, 10원짜리 동전, 1원짜리 동전이 각각 몇개로 변환되는지 출력하라.
package Java11_3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Java11_3 extends JFrame {
private String [] str = {"금액","오만원", "만원", "천원", "500원", "100원", "50원", "10원", "1원"};
private int [] mn = {50000, 10000, 1000, 500, 100, 50, 10, 1};
private JButton btn = new JButton("계산");
private JTextField [] tf = new JTextField[str.length];
private JLabel la;
Java11_3(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setBackground(Color.PINK);
c.setLayout(null);
la = new JLabel(str[0]);
la.setSize(40, 20);
la.setLocation(30, 20);
tf[0] = new JTextField(30);
tf[0].setSize(100, 20);
tf[0].setLocation(90, 20);
btn.setSize(70, 20);
btn.setLocation(200, 20);
c.add(la);c.add(tf[0]);c.add(btn);
for(int i=1; i<str.length; i++){
la = new JLabel(str[i]);
la.setHorizontalAlignment(JLabel.RIGHT);
la.setSize(50, 20);
la.setLocation(50, 50+(i*20));
tf[i] = new JTextField(30);
tf[i].setHorizontalAlignment(JTextField.CENTER);
tf[i].setSize(70, 20);
tf[i].setLocation(120, 50+(i*20));
c.add(la); c.add(tf[i]);
}
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String input = tf[0].getText();
if(input.length() == 0)
return;
int money = Integer.parseInt(input);
int m;
for(int i=0; i<mn.length; i++){
m = money/mn[i];
tf[i+1].setText(String.valueOf(m));
if(m>0)
money%=mn[i];
}
}
});
setSize(300, 300);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Java11_3();
}
}
[11장 4번]
실습문제 3번에 체크박스를 추가하여, 사용자가 선택한 체크박스에 해당하는 돈으로만 바꿀 수 있도록 하라.
package Java11_4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class Java11_4 extends JFrame {
private String [] str = {"금액","오만원", "만원", "천원", "500원", "100원", "50원", "10원", "1원"};
private int [] mn = {50000, 10000, 1000, 500, 100, 50, 10, 1};
private JButton btn = new JButton("계산");
private JTextField [] tf = new JTextField[str.length];
private JLabel [] la = new JLabel[str.length];
private JCheckBox [] cb = new JCheckBox[mn.length-1];
private boolean [] check = new boolean[mn.length]; // 체크 되었는지 확인, 되었으면 true
private boolean bl;
Java11_4(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setBackground(Color.PINK);
c.setLayout(null);
for(int i=0; i<check.length; i++){
check[i] = true;
}
la[0] = new JLabel(str[0]);
la[0].setSize(50, 20);
la[0].setLocation(20, 20);
tf[0] = new JTextField(30);
tf[0].setSize(100, 20);
tf[0].setLocation(80, 20);
btn.setSize(70, 20);
btn.setLocation(210, 20);
btn.addActionListener(new btnClick());
c.add(la[0]);c.add(tf[0]);c.add(btn);
for(int i=1; i<str.length; i++){
la[i] = new JLabel(str[i]);
la[i].setHorizontalAlignment(JLabel.RIGHT);
la[i].setSize(50, 20);
la[i].setLocation(50, 50+(i*20));
tf[i] = new JTextField(30);
tf[i].setHorizontalAlignment(JTextField.CENTER);
tf[i].setSize(70, 20);
tf[i].setLocation(120, 50+(i*20));
c.add(la[i]); c.add(tf[i]);
}
for(int i=0; i<cb.length; i++){
cb[i] = new JCheckBox();
cb[i].addItemListener(new check_c());
cb[i].setHorizontalAlignment(JCheckBox.RIGHT);
cb[i].setBackground(Color.PINK);
cb[i].setSize(20, 20);
cb[i].setLocation(200, 70+(i*20));
c.add(cb[i]);
}
setSize(300, 300);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
class btnClick implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String input = tf[0].getText();
if(input.length() == 0) return;
int money = Integer.parseInt(input);
int m;
for(int i=0; i<mn.length; i++){
if(check[i] == true){
m = money/mn[i];
tf[i+1].setText(String.valueOf(m));
if(m>0)
money%=mn[i];
}
else
tf[i+1].setText("0");
}
}
}
class check_c implements ItemListener{
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) bl = true;
else bl = false;
for(int i=0; i<check.length-1; i++){
if(e.getItem() == cb[i])
check[i] = bl;
else if(i==7)
check[i]=true;
}
}
}
public static void main(String[] args) {
new Java11_4();
}
}
[11장 5번]
100에서 200까지 조절할 수 있는 수평 슬라이더와 레이블을 하나 만들고 사용자가 슬라이더를 움직이면 레이블 컴포넌트에 수치로 보여주는 스윙 응용프로그램을 작성하라.
package Java11_5;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
public class Java11_5 extends JFrame {
Java11_5(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JSlider js = new JSlider(JSlider.HORIZONTAL, 100, 200, 100);
js.setMajorTickSpacing(20);
js.setPaintLabels(true);
js.setPaintTicks(true);
JLabel la = new JLabel();
la.setHorizontalAlignment(JLabel.CENTER);
la.setOpaque(true);
la.setBackground(Color.GREEN);
la.setText(Integer.toString(js.getValue()));
c.add(js); c.add(la);
js.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider s = (JSlider)e.getSource();
la.setText(Integer.toString(js.getValue()));
}
});
setSize(300, 300);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Java11_5();
}
}
[11장 6번]
JLabel 컴포넌트와 JTextArea 컴포넌트를 하나 만들고 문자열을 입력할 때마다 입력된 글자 수에 맞게 슬라이더 바가 자동으로 움직이게 하고 100자 이상 입력할 수 없게 하라. 또한 사용자가 마우스로 슬라이더 손잡이를 움직이면 슬라이더의 크기만큼 텍스트영역의 글자가 지워지도록 하라.
package Java11_6;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Java11_6 extends JFrame {
private JSlider js = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
private JTextArea ja = new JTextArea(null, 10, 25);
Java11_6(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
js.setPaintLabels(true);
js.setPaintTicks(true);
js.setPaintTrack(true);
js.setMajorTickSpacing(20);
js.setMinorTickSpacing(5);
ja.setText("");
ja.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
String str = ja.getText();
int length = str.length();
js.setValue(length);
}
});
js.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider s = (JSlider)e.getSource();
String str = ja.getText();
int length = str.length();
ja.replaceRange("", js.getValue(), length);
}
});
c.add(ja); c.add(js);
setSize(300, 300);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Java11_6();
}
}
[11장 7번]
수평 슬라이더를 만들고, 슬라이더를 움직이면 문자열 레이블의 글자 크기를 조절할 수 있는 스윙 응용프로그램을 작성하라.
package Java11_7;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Java11_7 extends JFrame {
private JSlider js = new JSlider(1, 100, 20);
private JLabel la = new JLabel("I Love Java");
Java11_7(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
js.setPaintLabels(true);
js.setPaintTicks(true);
js.setPaintTrack(true);
js.setMajorTickSpacing(20);
js.setMinorTickSpacing(5);
la.setHorizontalAlignment(SwingConstants.CENTER);
js.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider s = (JSlider)e.getSource();
int value = s.getValue();
la.setFont(new Font("TimesRoman", Font.PLAIN, s.getValue()));
}
});
c.add(js, BorderLayout.NORTH); c.add(la, BorderLayout.CENTER);
setSize(300, 300);
setLocationRelativeTo(null);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
public static void main(String[] args) {
new Java11_7();
}
}
[11장 8번]
이미지 갤러리를 만들어보자. 다음과 같이 2개의 라디오버튼과 이미지가 출력된다. 이미지를 클릭하면 다음 이미지를 보여준다.
package Java11_8;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.*;
public class Java11_8 extends JFrame {
private JLabel image = null;
private File file = new File("C:\\Users\\User\\IdeaProjects\\Java11\\images");
private File[] filelist = file.listFiles();
private ImageIcon [] imc = new ImageIcon[filelist.length];
private String [] imgstr = new String[filelist.length];
private JRadioButton radio[] = new JRadioButton[2];
private String radio_name [] = {"Left", "Right"};
int inum=0;
Java11_8(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i=0; i<filelist.length; i++){
imgstr[i] = String.valueOf(filelist[i]);
}
for(int i=0; i<imgstr.length; i++){
imc[i] = new ImageIcon(imgstr[i]);
}
image = new JLabel(imc[inum]);
JPanel jpn1 = new JPanel();
JPanel jpn2 = new JPanel(new FlowLayout());
ButtonGroup group = new ButtonGroup();
for(int i=0; i<radio.length; i++){
radio[i] = new JRadioButton(radio_name[i]);
group.add(radio[i]);
jpn1.add(radio[i]);
}
jpn2.add(image);
add(jpn1, BorderLayout.NORTH); add(jpn2, BorderLayout.CENTER);
image.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(radio[0].isSelected()){
inum--;
if(inum<0)
inum=filelist.length-1;
image.setIcon(imc[inum]);
}
else if(radio[1].isSelected()){
inum++;
if(inum>filelist.length-1)
inum=0;
image.setIcon(imc[inum]);
}
}
});
setSize(300, 300);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new Java11_8();
}
}
[11장 9번]
사용자(me)와 컴퓨터(com)가 가위바위보를 하는 스윙 프로그램을 작성해보자.
package Java11_9;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import javax.swing.*;
public class Java11_9 extends JFrame {
private JButton[] btn = new JButton[3];
ImageIcon [] image = new ImageIcon[3];
JLabel myS = new JLabel(); // my 결과 image
JLabel comS = new JLabel(); // com 결과 image
JLabel me = new JLabel("me");
JLabel com = new JLabel("com");
JLabel result = new JLabel();
class North extends JPanel{
North(){
setBackground(Color.GRAY);
setLayout(new FlowLayout());
for(int i=0; i<3; i++){
btn[i] = new JButton(image[i]);
add(btn[i]);
btn[i].addMouseListener(new ImageClick());
}
}
}
class Center extends JPanel{
Center(){
setBackground(Color.YELLOW);
setLayout(new FlowLayout());
add(myS);
add(me);
add(comS);
add(com);
result.setOpaque(true);
result.setForeground(Color.RED);
add(result);
}
}
Java11_9(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new BorderLayout());
image[0] = new ImageIcon("C:\\Users\\User\\IdeaProjects\\Java11\\gbb\\1.png"); // 가위
image[1] = new ImageIcon("C:\\Users\\User\\IdeaProjects\\Java11\\gbb\\2.png"); // 바위
image[2] = new ImageIcon("C:\\Users\\User\\IdeaProjects\\Java11\\gbb\\3.png"); // 보
c.add(new North(), BorderLayout.NORTH);
c.add(new Center(), BorderLayout.CENTER);
setSize(600, 500);
setLocationRelativeTo(null);
setVisible(true);
}
class ImageClick extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
JButton jb = (JButton)e.getSource();
int n = (int)(Math.random()*3); // 컴퓨터 랜덤
if(btn[0] == jb){ // user가 가위 선택
myS.setIcon(image[0]);
comS.setIcon(image[n]);
if(n==0)
result.setText("Same !!");
else if(n==1)
result.setText("Computer !!");
else
result.setText("Me !!");
}
else if(btn[1]==jb){ // user가 바위 선택
myS.setIcon(image[1]);
comS.setIcon(image[n]);
if(n==0)
result.setText("Me !!");
else if(n==1)
result.setText("Same !!");
else
result.setText("Computer !!");
}
else{ // user가 바위 선택
myS.setIcon(image[2]);
comS.setIcon(image[n]);
if(n==0)
result.setText("Computer !!");
else if(n==1)
result.setText("Me !!");
else
result.setText("Same !!");
}
}
}
public static void main(String[] args) {
new Java11_9();
}
}
[11장 10번]
10개의 레이블을 순서대로 클릭하는 간단한 게임을 만들어보자.
package Java11_10;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class Java11_10 extends JFrame {
private String[] str = {"0","1", "2", "3", "4", "5", "6", "7", "8", "9" };
private JLabel[] la = new JLabel[10];
private boolean[] check = new boolean[10];
private int x, y;
private int count = 0;
Java11_10(){
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);
for(int i=0; i<check.length; i++)
check[i] = false;
for(int i=0; i<10; i++){
la[i] = new JLabel(str[i]);
x = (int)(Math.random()*400);
y = (int)(Math.random()*400);
la[i].setOpaque(true);
la[i].setForeground(Color.PINK);
la[i].setSize(20, 20);
la[i].setLocation(x, y);
la[i].addMouseListener(new Click());
c.add(la[i]);
}
setSize(450, 450);
setVisible(true);
}
class Click extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource() == la[count]){
la[count].setVisible(false);
check[count] = true;
count++;
if(count==10){
for(int j=0; j<check.length; j++){
int x = (int)(Math.random()*400);
int y = (int)(Math.random()*400);
la[j].setLocation(x, y);
la[j].setVisible(true);
check[j] = false;
}
}
}
}
}
public static void main(String[] args) {
new Java11_10();
}
}