정리필요2

자바3주차 시험자료

ShineWithMe 2008. 9. 1. 00:46

package p1;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

public class Circlecomponent extends JComponent{
 
 public Circlecomponent(int x, int y)
 {
  circle = new Ellipse2D.Double(x, y, 100, 100);
 }
 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D) g;
  g2.setColor(col);
  g2.fill(circle);
  g2.draw(circle);  
 }
 public void setColor(Color c)
 {
  col = c;
  repaint();
 }
 private Ellipse2D.Double circle;
 private Color col = Color.white;
}

package p1;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;

public class CircleViewer {

 public static void main(String[] args) {
 
  JFrame frame = new JFrame();
  frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
  final Circlecomponent component = new Circlecomponent(FRAME_WIDTH/2-50, FRAME_HEIGHT/2-50);
 
  JButton button1 = new JButton("RED");
  JButton button2 = new JButton("BLUE");
  JButton button3 = new JButton("YELLOW");
 
  class ClickListener implements ActionListener {
   
   public ClickListener(JButton b)
   {
    button = b;
   }
   
   public void actionPerformed(ActionEvent event)
   {
    button = (JButton)event.getSource(); // 리스너가 하나일시 event발생 소스로 버튼을 구분한다.

    if(button.getText().equals("RED"))
    {
     component.setColor(Color.red);
    }
    else if(button.getText().equals("BLUE"))
    {
     component.setColor(Color.blue);
    }
    else if(button.getText().equals("YELLOW"))
    {
     component.setColor(Color.yellow);
    }
   }  
   private JButton button;
  }
 
  JPanel p1 = new JPanel();
 
  button1.setSize(100, 80);
  button2.setSize(100, 80);
  button3.setSize(100, 80);
  p1.add(button1);
  p1.add(button2);
  p1.add(button3);
 
  p1.setSize(300, 80);  
  frame.add(p1);
  p1.setLocation(FRAME_WIDTH/2-150, FRAME_HEIGHT-200);
  frame.add(component);
 
  ActionListener listener1 = new ClickListener(button1);
  listener1 = new ClickListener(button2);
  listener1 = new ClickListener(button3);
  button1.addActionListener(listener1);
  button2.addActionListener(listener1);
  button3.addActionListener(listener1);

  frame.setVisible(true);
 
 }
 private static final int FRAME_WIDTH = 600;
 private static final int FRAME_HEIGHT = 600;

}

package p2;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

public class Circlecomponent extends JComponent{
 
 public Circlecomponent(int x, int y)
 {
  circle = new Ellipse2D.Double(x, y, 100, 100);
 }
 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D) g;
  g2.setColor(col);
  g2.fill(circle);
  g2.draw(circle);  
 }
 public void setColor(Color c)
 {
  col = c;
  repaint();
 }
 private Ellipse2D.Double circle;
 private Color col = Color.white;
}

package p2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;

public class CircleViewer {

 public static void main(String[] args) {
 
  JFrame frame = new JFrame();
  frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
  final Circlecomponent component = new Circlecomponent(FRAME_WIDTH/2-50, FRAME_HEIGHT/2-50);
 
  JCheckBox check1 = new JCheckBox("RED");
  JCheckBox check2 = new JCheckBox("GREEN");
  JCheckBox check3 = new JCheckBox("BLUE");
 
  class ClickListener implements ActionListener {
   
   public ClickListener(JCheckBox b)
   {
    check = b;
   }
   
   public void actionPerformed(ActionEvent event)
   {
    check = (JCheckBox)event.getSource(); // 리스너가 하나일시 event발생 소스로 버튼을 구분한다.
   
    if(check.getText().equals("RED"))
    {
     if(r==0)
      r = 1;
     else
      r = 0;
     
    }
    else if(check.getText().equals("GREEN"))
    {
     if(g==0)
      g = 1;
     else
      g = 0;
    }
    else if(check.getText().equals("BLUE"))
    {
     if(b==0)
      b = 1;
     else
      b = 0;
    }

    component.setColor(new Color(r, g, b));
   }  
   private float r=0, g=0, b=0;
   private JCheckBox check;
  }
 
  JPanel p1 = new JPanel();
 
  check1.setSize(100, 80);
  check2.setSize(100, 80);
  check3.setSize(100, 80);
  p1.add(check1);
  p1.add(check2);
  p1.add(check3);
 
  p1.setSize(300, 80);  
  frame.add(p1);
  p1.setLocation(FRAME_WIDTH/2-150, FRAME_HEIGHT-200);
  frame.add(component);
 
  ActionListener listener1 = new ClickListener(check1);
  listener1 = new ClickListener(check2);
  listener1 = new ClickListener(check3);
  check1.addActionListener(listener1);
  check2.addActionListener(listener1);
  check3.addActionListener(listener1);

  frame.setVisible(true);
 }
 
 private static final int FRAME_WIDTH = 600;
 private static final int FRAME_HEIGHT = 600;
}

package p3;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

public class Circlecomponent extends JComponent{
 
 public Circlecomponent(int x, int y)
 {
  circle = new Ellipse2D.Double(x, y, 100, 100);
 }
 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D) g;
  g2.setColor(col);
  g2.fill(circle);
  g2.draw(circle);  
 }
 public void setColor(Color c)
 {
  col = c;
  repaint();
 }
 private Ellipse2D.Double circle;
 private Color col = Color.white;
}

package p3;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;


import java.awt.Color;

public class CircleViewer {

 public static void main(String[] args) {
 
  JFrame frame = new JFrame();
  frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
  final Circlecomponent component = new Circlecomponent(FRAME_WIDTH/2-50, FRAME_HEIGHT/2-50);
 
  final JSlider slider1 = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 10);
  final JSlider slider2 = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 10);
  final JSlider slider3 = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 10);
 
  slider1.setName("RED");
  slider2.setName("GREEN");
  slider3.setName("BLUE");

  class Listener implements ChangeListener {
   
   public Listener(JSlider b){
    slider = b;
   }
   
   public void stateChanged(ChangeEvent e){
   
    slider = (JSlider)e.getSource();

    if(slider.equals(slider1))
    {
     r = slider.getValue();
    }
    if(slider.equals(slider2))
    {
     g = slider.getValue();
    }
    if(slider.equals(slider3))
    {
     b = slider.getValue();
    }
   
    component.setColor(new Color(r, g, b));
   
   }  
   private JSlider slider;
   private int r, g, b;
  }
 
  JPanel p1 = new JPanel();
  JPanel p2 = new JPanel();
  JPanel p3 = new JPanel();
  p1.setBorder(new TitledBorder(slider1.getName()));
  p1.add(slider1);
  p2.setBorder(new TitledBorder(slider2.getName()));
  p2.add(slider2);
  p3.setBorder(new TitledBorder(slider3.getName()));
  p3.add(slider3);
 
  p1.setSize(300, 50);
  p1.setLocation(FRAME_WIDTH/2-150, FRAME_HEIGHT/2+60);
 
  p2.setSize(300, 50);
  p2.setLocation(FRAME_WIDTH/2-150, FRAME_HEIGHT/2+120);
 
  p3.setSize(300, 50);
  p3.setLocation(FRAME_WIDTH/2-150, FRAME_HEIGHT/2+180);
 
  frame.add(p1);
  frame.add(p2);
  frame.add(p3);
  frame.add(component);
 
 
  Listener listener = new Listener(slider1);
  listener = new Listener(slider2);
  listener = new Listener(slider3);
 
  slider1.addChangeListener(listener);
  slider2.addChangeListener(listener);
  slider3.addChangeListener(listener);

  frame.setVisible(true);
 
 }
 
 
 private static final int FRAME_WIDTH = 600;
 private static final int FRAME_HEIGHT = 600;

}

package p4;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class SliderFrame extends JFrame {

 public SliderFrame()
 {
  JPanel colorPanel = new JPanel();
  colorPanel.setLayout(new GridLayout(2, 1));
 
  colorP = new JPanel(); // 현재 그려질 패널
  colorP.setBackground(Color.black);

  colorPanel_1 = new JPanel(); // 윗패널
  colorPanel_1.setBackground(Color.black);
  colorPanel_2 = new JPanel(); // 아랫패널
  colorPanel_2.setBackground(Color.black);
 
  colorPanel.add(colorPanel_1);
  colorPanel.add(colorPanel_2);
 
  colorP = colorPanel_1;
 
  add(colorPanel, BorderLayout.CENTER);
  createControlPanel();
  setSampleColor();
  setSize(FRAME_WIDTH, FRAME_HEIGHT);
 }
 
 public void createControlPanel()
 {
  class MousePressListener implements MouseListener{
   public MousePressListener(){}
   public void mousePressed(MouseEvent event){}
   public void mouseReleased(MouseEvent event){
    colorP = (JPanel)event.getSource();
    nowColor = new Color(colorP.getBackground().getRed(),
      colorP.getBackground().getGreen(),
      colorP.getBackground().getBlue());
   
    redSlider.setValue(nowColor.getRed());
    greenSlider.setValue(nowColor.getGreen());
    blueSlider.setValue(nowColor.getBlue());  
   }
   public void mouseClicked(MouseEvent event){}
   public void mouseEntered(MouseEvent event){}
   public void mouseExited(MouseEvent event){}
  }
 
  class ColorListener implements ChangeListener {
   public void stateChanged(ChangeEvent event) {
    setSampleColor();
   }
  }

  MousePressListener listenerM = new MousePressListener();
  colorPanel_1.addMouseListener(listenerM);
  colorPanel_2.addMouseListener(listenerM);
 
  ChangeListener listener = new ColorListener();
 
  redSlider = new JSlider(0, 255, 0);
  redSlider.addChangeListener(listener);
 
  greenSlider = new JSlider(0, 255, 0);
  greenSlider.addChangeListener(listener);
 
  blueSlider = new JSlider(0, 255, 0);
  blueSlider.addChangeListener(listener);
 
  JPanel controlPanel = new JPanel();
  controlPanel.setLayout(new GridLayout(3, 2));
 
  controlPanel.add(new JLabel("Red"));
  controlPanel.add(redSlider);
 
  controlPanel.add(new JLabel("Green"));
  controlPanel.add(greenSlider);

  controlPanel.add(new JLabel("Blue"));
  controlPanel.add(blueSlider);

  add(controlPanel, BorderLayout.SOUTH);  
 }

 public void setSampleColor()
 {
  int red = redSlider.getValue();
  int green = greenSlider.getValue();
  int blue = blueSlider.getValue();

  colorP.setBackground(new Color(red, green, blue));
  colorP.repaint();
 
 }
 
 private JPanel colorP, colorPanel_1, colorPanel_2;
 
 private Color nowColor;
 private JSlider redSlider;
 private JSlider greenSlider;
 private JSlider blueSlider;
 
 private static final int FRAME_WIDTH = 300;
 private static final int FRAME_HEIGHT = 400;
}

package p4;

import javax.swing.JFrame;

public class SliderFrameViewer {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 
  SliderFrame frame = new SliderFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 }

}

package p5;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class CalComponent extends JFrame {
 public CalComponent()
 {
  calPanel = new JPanel();
  input1 = new JTextField("입력1  ");
  //input1.setSize(200, 80);
  input2 = new JTextField("입력2  ");
  //input2.setSize(200, 80);
  cBox = new JComboBox(op);
  equal = new JLabel("=");
  result = new JTextField("결과   ");
  //result.setSize(200, 80);
 
  calPanel.add(input1);
  calPanel.add(cBox);
  calPanel.add(input2);
  calPanel.add(equal);
  calPanel.add(result);
 
  add(calPanel);
  createControlPanel();
  setSize(FRAME_WIDTH, FRAME_HEIGHT);
 }
 
 public void createControlPanel()
 {

  cBox.addItemListener(new ItemListener() {
   public void itemStateChanged(ItemEvent ev) {
    if(ev.getStateChange() == ItemEvent.SELECTED){    
     JComboBox jbox = (JComboBox)ev.getItemSelectable();
     String str = jbox.getSelectedItem().toString();
     
     double x, y, r;
     x = Double.parseDouble(input1.getText());
     y = Double.parseDouble(input2.getText());
     
     if(str.equals("+")){
      r = x + y;      
      result.setText(""+r+"");
     }else if(str.equals("-")){
      r = x - y;      
      result.setText(""+r+"");
     }else if(str.equals("*")){
      r = x * y;      
      result.setText(""+r+"");
     }else if(str.equals("/")){
      r = x / y;      
      result.setText(""+r+"");
     }
    }
   }
  });  
 }
 
 private JPanel calPanel;
 private JTextField input1;
 private JTextField input2;
 private String op[] = {" ", "+", "-", "*", "/"};
 private JComboBox cBox;
 private JLabel equal;
 private JTextField result;
 
 private static final int FRAME_WIDTH = 900;
 private static final int FRAME_HEIGHT = 100;

}

package p5;

import javax.swing.JFrame;

public class CalTester {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 
  CalComponent frame = new CalComponent();
  frame.setTitle("허접계산기");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 }

}

/** BankAccount.java */
package p1;

import java.lang.IllegalArgumentException;

public class BankAccount {
 public BankAccount() {
  balance = 0;
 }
 public BankAccount(double initialBalance) {
  if(initialBalance < 0) {
   throw new IllegalArgumentException("음수 금액의 계좌 개설은 불가능 합니다.");
  }
  balance = initialBalance;
 }
 public void despoit(double amount) {
  if(amount < 0) {
   throw new IllegalArgumentException("음수 금액의 입금은 불가능 합니다.");
  }
  double newBalnace = balance + amount;
  balance = newBalnace;
 }
 public void withdraw(double amount) {
  if(amount < 0 || amount > balance) {
   throw new IllegalArgumentException("음수 금액과 계좌금액의 한도를 넘은 금액의 출금은 불가능 합니다.");
  }
  double newBalance = balance - amount;
  balance = newBalance;
 }
 public double getBalance() {
  return balance;
 }
 
 private double balance;
}

/** BankAccountExceptionTester.java */
package p1;

import java.lang.IllegalArgumentException;
import java.util.Scanner;

public class BankAccountExceptionTester {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc = new Scanner(System.in);
  BankAccount ba;
  int coni = 1;
 
  System.out.print("계좌 개설 금액: ");
  double money = sc.nextDouble();
 
  try {
   ba = new BankAccount(money);
  }
  catch(IllegalArgumentException exception) {
   System.out.println("생성자 호출에서 오류가 발생하였습니다.");
   exception.getMessage();
   exception.printStackTrace();
   
   ba = new BankAccount();
  }
 
  while(coni != 0) {
   System.out.print("1.입금 , 2.출금, 0.거래종료: ");
   coni = sc.nextInt();
   
   if(coni != 0) {
    System.out.print("거래 금액: ");
    money = sc.nextInt();
   
    if(coni == 1) {
     try {
      System.out.println(money + "입금.");
      ba.despoit(money);
     }
     catch(IllegalArgumentException exception) {
      System.out.println("deposit 메서드 호출에서 오류가 발생하였습니다.");
      exception.getMessage();
      exception.printStackTrace();
     }
    }
    else if(coni == 2) {
     try {
      System.out.println(money + "출금.");
      ba.withdraw(money);
     }
     catch(IllegalArgumentException exception) {
      System.out.println("withdraw 메서드 호출에서 오류가 발생하였습니다.");
      exception.getMessage();
      exception.printStackTrace();
     }
    }
    else {
     System.out.println("다시 선택하세요.");
    }
   
    System.out.println("계좌잔고: " + ba.getBalance());
   }
  }
 }
}

/** BankAccountExceptionTester.java */
package p1;

import java.lang.IllegalArgumentException;
import java.util.Scanner;

public class BankAccountExceptionTester {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc = new Scanner(System.in);
  BankAccount ba;
  int coni = 1;
 
  System.out.print("계좌 개설 금액: ");
  double money = sc.nextDouble();
 
  try {
   ba = new BankAccount(money);
  }
  catch(IllegalArgumentException exception) {
   System.out.println("생성자 호출에서 오류가 발생하였습니다.");
   exception.getMessage();
   exception.printStackTrace();
   
   ba = new BankAccount();
  }
 
  while(coni != 0) {
   System.out.print("1.입금 , 2.출금, 0.거래종료: ");
   coni = sc.nextInt();
   
   if(coni != 0) {
    System.out.print("거래 금액: ");
    money = sc.nextInt();
   
    if(coni == 1) {
     try {
      System.out.println(money + "입금.");
      ba.despoit(money);
     }
     catch(IllegalArgumentException exception) {
      System.out.println("deposit 메서드 호출에서 오류가 발생하였습니다.");
      exception.getMessage();
      exception.printStackTrace();
     }
    }
    else if(coni == 2) {
     try {
      System.out.println(money + "출금.");
      ba.withdraw(money);
     }
     catch(IllegalArgumentException exception) {
      System.out.println("withdraw 메서드 호출에서 오류가 발생하였습니다.");
      exception.getMessage();
      exception.printStackTrace();
     }
    }
    else {
     System.out.println("다시 선택하세요.");
    }
   
    System.out.println("계좌잔고: " + ba.getBalance());
   }
  }
 }
}

/** BankAccountException.java */
package p2;

public class BankAccountException extends Exception {

 public BankAccountException() {
  super();
 }

 public BankAccountException(String msg) {
  super(msg);
 }
}

/** BankAccountExceptionTester.java */
package p2;

import java.util.Scanner;

public class BankAccountExceptionTester {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc = new Scanner(System.in);
  BankAccount ba;
  int coni = 1;

  System.out.print("계좌 개설 금액: ");
  double money = sc.nextDouble();

  try {
   ba = new BankAccount(money);
  }
  catch(BankAccountException exception) {
   System.out.println("생성자 호출에서 오류가 발생하였습니다.");
   exception.getMessage();
   exception.printStackTrace();

   ba = new BankAccount();
  }

  while(coni != 0) {
   System.out.print("1.입금 , 2.출금, 0.거래종료: ");
   coni = sc.nextInt();

   if(coni != 0) {
    System.out.print("거래 금액: ");
    money = sc.nextInt();

    if(coni == 1) {
     try {
      System.out.println(money + "입금.");
      ba.despoit(money);
     }
     catch(BankAccountException exception) {
      System.out.println("deposit 메서드 호출에서 오류가 발생하였습니다.");
      exception.getMessage();
      exception.printStackTrace();
     }
    }
    else if(coni == 2) {
     try {
      System.out.println(money + "출금.");
      ba.withdraw(money);
     }
     catch(BankAccountException exception) {
      System.out.println("withdraw 메서드 호출에서 오류가 발생하였습니다.");
      exception.getMessage();
      exception.printStackTrace();
     }
    }
    else {
     System.out.println("다시 선택하세요.");
    }

    System.out.println("계좌잔고: " + ba.getBalance());
   }
  }

 }
}

/** BadDataException.java */
package p3;

public class BadDataException extends Exception {

 public BadDataException() {
  super();
 }

 public BadDataException(String eMessage) {
  super(eMessage);
 }
}

/** DataSetReader.java */
package p3;

import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class DataSetReader {

 public double[] readFile(String filename) throws IOException, BadDataException {
  FileReader reader = new FileReader(filename);
  try {
   Scanner in = new Scanner(reader);
   readData(in);
  }
  finally {
   reader.close();
  }
  return data;
 }

 private void readData(Scanner in) throws BadDataException {
  if(!in.hasNextInt()) {
   throw new BadDataException("Length expected");
  }
  int numberOfValues = in.nextInt();
  data = new double[numberOfValues];

  for(int i=0; i<numberOfValues; i++) {
   readValue(in, i);
  }

  if(in.hasNext()) {
   throw new BadDataException("End of file expected");
  }
 }

 private void readValue(Scanner in, int i) throws BadDataException {
  if(!in.hasNextDouble()) {
   throw new BadDataException("Data value expected");
  }
  data[i] = in.nextDouble();
 }

 private double[] data;
}

/** DataSetTester.java */
package p3;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class DataSetTester {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner in = new Scanner(System.in);
  DataSetReader reader = new DataSetReader();

  boolean done = false;
  while(!done) {
   try {
    System.out.println("Please enter the file name: ");
    String filename = in.next();

    double[] data = reader.readFile(filename);
    double sum = 0;
    System.out.println("The sum is " + sum);
    done = true;
   }
   catch(FileNotFoundException exception) {
    System.out.println("File not found.");
   }
   catch(BadDataException exception) {
    System.out.println("Bad data: " + exception.getMessage());
   }
   catch(IOException exception) {
    exception.printStackTrace();
   }
  }
 }

}

package p4;

import javax.swing.JComponent;
import java.awt.geom.Ellipse2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;

public class DrawComponent extends JComponent
{
 private String shape;
 
 public DrawComponent(String sh)
 {
  shape = sh;
 }
 
 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D) g;
 
  if(shape.equals("원"))
  {
   g2.setColor(Color.RED);
   g2.fill(new Ellipse2D.Double(0,0,getWidth(),getHeight()));
  }
  else
  {
   g2.setColor(Color.BLUE);
   g2.fill(new Rectangle(0,0,getWidth(),getHeight()));
  }
 
 }
}

package p4;

import javax.swing.JFrame;
import java.io.FileReader;
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.util.NoSuchElementException;

public class DrawFrame
{
 public static final int Width = 400;
 public static final int Height = 300;
 
 private JFrame frame;
 private DrawComponent component;
 
 public DrawFrame(String shape)
 {
  frame = new JFrame("Program04!!");
  component = new DrawComponent(shape);
 
  frame.setSize(Width,Height);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
  frame.add(component);
  frame.setVisible(true);
 }
 
 public void draw()
 {
  frame.setVisible(true);
 }
 
 public static void main(String[] args)
 {
  Scanner sc = new Scanner(System.in);
  boolean done = false;
 
  while(!done)
  {
   System.out.println("파일 이름을 입력하세요.");
   String filename = sc.next();
   try
   {
    Scanner fin = new Scanner(new FileReader(filename));  
    String shape = fin.next();
   
    if(shape.equals("원") || shape.equals("사각형"))
    {
     DrawFrame df = new DrawFrame(shape);
     df.draw();
     done = true;
    }
   }
   /*
    * FileReader의 생성자가 던지는 예외
    */
   catch(FileNotFoundException exception)
   {
    System.out.println("파일을 찾을 수 없습니다.");
    exception.printStackTrace();
   }
   /*
    * Scanner의 next()메소드가 던지는 예외
    */
   catch(IllegalStateException exception)
   {
    System.out.println("파일에서 읽을 수 없습니다.");
    exception.printStackTrace();
   }
   /*
    * Scanner의 next()메소드가 던지는 예외
    */
   catch(NoSuchElementException exception)
   {
    System.out.println("스트링 타입의 데이터를 읽을 수 없습니다.");
    exception.printStackTrace();
   }
  }
 }
}

package p1;

import java.io.FileReader;
import java.io.IOException;

public class FileCounter {
    public FileCounter()
    {
       chars = 0;
       words = 0;
       lines = 0;
    }

    public void read(FileReader reader) throws IOException
    {
       boolean space = true;
       boolean more = true;
      
       while (more)
       { 
          int ic = reader.read();
          if (ic == -1) more = false;
          else
          { 
             chars++;
             char c = (char) ic;
             if (c == '\n')
             {
                lines++;
                space = true;
             }
             else if (c == ' ' || c == '\r')
                space = true;
             else
             { 
                if (space)
                   words++;   // 공백문자 다음의 비공백 문자를 만날때마다 증가
                space = false;
             }
          }
          lines++;
       }
    }

    public int getCharacterCount()
    {
       return chars;
    }
 
    public int getWordCount()
    {
       return words;
    }
 
    public int getLineCount()  
    {
       return lines;
    }   
      
    private int chars;
    private int words;
    private int lines;
}

package p1;

import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFileChooser;
import java.util.Scanner;
import java.io.File;

public class ExP16_1 {
 public static void main(String[] args) {
       Scanner in = new Scanner(System.in);
       String input = "";
      
       JFileChooser chooser = new JFileChooser();
       FileReader fin = null;
      
       try
       { 
          boolean done = false;
          while (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
          {
          File selectedFile = chooser.getSelectedFile();
          fin = new FileReader(selectedFile);

                FileCounter fileCounter = new FileCounter();
                fileCounter.read(fin);         
                System.out.println(
                     fileCounter.getCharacterCount() + " chars, "
                     + fileCounter.getWordCount() + " words, "
                     + fileCounter.getLineCount() + " lines");
                fin.close();
            
          }
       }
       catch (IOException e)
       { 
          e.printStackTrace();
       }
 }
}

package p2;

import java.io.IOException;
import java.io.FileReader;
import java.io.FileWriter;

public class CatFiles {
 public static void main(String[] args) {
       if (args.length < 2)
       { 
          System.out.println("Usage: CatFiles sourcefile1 sourcefile2 . . . targetfile");
          return;
       }

       try
       {
          FileWriter out = new FileWriter(args[args.length - 1]);
          for (int i = 0; i < args.length - 1; i++)
          {
             FileReader in = new FileReader(args[i]);
             boolean more = true;
             while (more)
             {
                int ic = in.read();
                if (ic == -1)
                   more = false;
                else
                   out.write(ic);
             }
             in.close();
          }
          out.close();
       }
       catch (IOException e)
       {
          e.printStackTrace();
       }
  }
}

package p3;

import java.awt.Rectangle;
import java.io.Serializable;

public class Squares extends Rectangle implements Serializable{
 public Squares(int x, int y, int w, int h){
  super(x, y, w, h);
 }
}

package p3;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
import java.util.ArrayList;

public class SquareComponent extends JComponent

 public SquareComponent() {
  sList = new ArrayList<Squares>();
 }
   public void paintComponent(Graphics g)
   { 
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      for (Rectangle r : sList)
       g2.draw(r);
   }
   public void makeRectangle(int x, int y)
   {
   sList.add(new Squares(x, y, BOX_WIDTH, BOX_HEIGHT));
      repaint();     
   }
   public ArrayList<Squares> getList(){
    return sList;
   }
   public void setList(ArrayList<Squares> a){
    sList = a;
   }
 
   private ArrayList<Squares> sList;
   private static final int BOX_WIDTH = 20;
   private static final int BOX_HEIGHT = 20;
}

package p3;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.util.ArrayList;

public class SquareFrame extends JFrame{
 public SquareFrame(){
  squaresDraw();
  chooser = new JFileChooser();
  JMenuBar menuBar = new JMenuBar();
  setJMenuBar(menuBar);
  menuBar.add(createFileMenu());
  setSize(FRAME_WIDTH, FRAME_HEIGHT);
 }
 
 public JMenu createFileMenu(){
  JMenu menu = new JMenu("File");
  menu.add(openFileItem());
  menu.add(saveFileItem());
  menu.add(createFileExitItem());
  return menu;
 }
 
 public JMenuItem createFileExitItem(){
  JMenuItem item = new JMenuItem("Exit");
  class MenuItemListener implements ActionListener{
   public void actionPerformed(ActionEvent event){
    System.exit(0);
   }
  }
  ActionListener listener = new MenuItemListener();
  item.addActionListener(listener);
  return item;
 }
 
 public JMenuItem openFileItem(){    
     JMenuItem item = new JMenuItem("Open");
  class MenuItemListener implements ActionListener{
   public void actionPerformed(ActionEvent event){
    try{
        if(chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
        {
         File selectedFile = chooser.getSelectedFile();
         ObjectInputStream in = new ObjectInputStream(new FileInputStream(selectedFile));
        
         component.setList((ArrayList<Squares>) in.readObject());
         component.repaint();
         in.close();
        }
     }
        catch (Exception e)
        { 
           e.printStackTrace();
        }
   }
  }
  ActionListener listener = new MenuItemListener();
  item.addActionListener(listener);
     return item;
 }
 
 public JMenuItem saveFileItem(){    
     JMenuItem item = new JMenuItem("Save");
  class MenuItemListener implements ActionListener{
   public void actionPerformed(ActionEvent event){
    try{
        if(chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)
        {
         File selectedFile = chooser.getSelectedFile();
             
         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(selectedFile));
         out.writeObject(component.getList());
  
         out.close();
        }
    }
    catch (Exception e){ 
          e.printStackTrace();
    }
   }
  }
  ActionListener listener = new MenuItemListener();
  item.addActionListener(listener);
     return item;
 }
 
 public void squaresDraw(){
     // 그림을 그릴 콤포넌트 올리기
  component = new SquareComponent();
  add(component, BorderLayout.CENTER);
 
     class MousePressListener implements MouseListener
     { 
        public void mousePressed(MouseEvent event)
        { 
           int x = event.getX();
           int y = event.getY();
           component.makeRectangle(x, y);
        }
        public void mouseReleased(MouseEvent event) {}
        public void mouseClicked(MouseEvent event) {}
        public void mouseEntered(MouseEvent event) {}
        public void mouseExited(MouseEvent event) {}
     }

  MouseListener listener = new MousePressListener();
  component.addMouseListener(listener);
 }
 

 private JFileChooser chooser;
    private SquareComponent component;
 private static final int FRAME_WIDTH = 800;
 private static final int FRAME_HEIGHT = 600;
 
}

package p3;

import javax.swing.JFrame;

public class ST {
 public static void main(String[] args) {
  JFrame frame = new SquareFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 }
}

package p1;

import java.util.Date;

public class GreetingR implements Runnable{
 public GreetingR(String a){
  greeting = a;
 }
 public void run(){
  try{
   for(int i=0; i<=REPET; i++){
    Date now = new Date();
    System.out.println(now + " " + greeting);
    Thread.sleep(DELAY);
   }
  }
  catch(InterruptedException exception){
   
  }
 }
 
 private String greeting;
 private static final int REPET = 10;
 private static final int DELAY = 1000;
}

package p1;

import java.util.Date;

public class GreetingRTester {
 public static void main(String[] args) {
  GreetingR r1 = new GreetingR("안녕");
  GreetingR r2 = new GreetingR("하이");
  GreetingR r3 = new GreetingR("어이");
  Thread t1 = new Thread(r1);
  Thread t2 = new Thread(r2);
  Thread t3 = new Thread(r3);
  t1.start();
  t2.start();
  t3.start();
 }
}

package p2;

public class BankAccount {
 public BankAccount(){
  balance = 0;
 }
 public void deposit(double amount){
  System.out.print("Depositing " + amount);
  double newBalance = balance + amount;
  System.out.println(", new balance is " + newBalance);
  balance = newBalance;
 }
 public void withdraw(double amount){
  System.out.print("Withdrawing " + amount);
  double newBalance = balance - amount;
  System.out.println(", new balance is " + newBalance);
  balance = newBalance;
 }
 public double getBalance(){
  return balance;
 }
 private double balance;
}

package p2;

public class DepositRunnable implements Runnable{
 public DepositRunnable(BankAccount anAccount, double anAmount, int aCount){
  account = anAccount;
  amount = anAmount;
  count = aCount;
 }
 public void run(){
  try{
   for(int i=1; i<=count; i++){
    account.deposit(amount);
    Thread.sleep(DELAY);
   }
  }
  catch(InterruptedException exception){}
 }
 private static final int DELAY = 1;
 private static BankAccount account;
 private double amount;
 private int count;
}

package p2;

public class WithdrawRunnable implements Runnable{
 public WithdrawRunnable(BankAccount anAccount, double anAmount, int aCount){
  account = anAccount;
  amount = anAmount;
  count = aCount;
 }
 public void run(){
  try{
   for(int i=1; i<=count; i++){
    account.withdraw(amount);
    Thread.sleep(DELAY);
   }
  }
  catch(InterruptedException exception) {}
 }
 private static final int DELAY = 1;
 private BankAccount account;
 private double amount;
 private int count;
}

package p2;

public class BankAccountThreadTester {
 public static void main(String[] args) {
  BankAccount account = new BankAccount();
  final double AMOUNT = 100;
  final int REPET = 1000;
 
  DepositRunnable d = new DepositRunnable(account, AMOUNT, REPET);
  WithdrawRunnable w = new WithdrawRunnable(account, AMOUNT, REPET);
 
  Thread t1 = new Thread(d);
  Thread t2 = new Thread(w);
 
  t1.start();
  t2.start();
 }
}

package p3;
public class RunThreads implements Runnable {
    public void run() {
       for (int i = 0; i < 25; i ++) {
          String threadName = Thread.currentThread().getName();
          System.out.println(threadName + " is running");
       }
    }
}

package p3;

public class RunThreadsTester {
   public static void main(String[] args) {
      RunThreads runner = new RunThreads();
      Thread alpha = new Thread(runner);
      Thread beta = new Thread(runner);
      alpha.setName("Alpha thread");
      beta.setName("Beta thread");
      alpha.start();
      beta.start();
   }
}

package p4;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class BankAccount {
 public BankAccount(){
  balance = 0;
  balanceChangeLock = new ReentrantLock();
  sufiicientFundsCondition = balanceChangeLock.newCondition();
 }
 public void deposit(double amount){
  balanceChangeLock.lock();
  try{
   System.out.print("Depositing " + amount);
   double newBalance = balance + amount;
   System.out.println(", new balance is " + newBalance);
         String threadName = Thread.currentThread().getName();
         System.out.println(threadName + " is running");
   balance = newBalance;
   sufiicientFundsCondition.signalAll();
  }
  finally{
   balanceChangeLock.unlock();
  }

 }
 public void withdraw(double amount) throws InterruptedException{
  balanceChangeLock.lock();
  try{
   while(balance < amount)
    sufiicientFundsCondition.await();
   System.out.print("Withdrawing " + amount);
   double newBalance = balance - amount;
   System.out.println(", new balance is " + newBalance);
         String threadName = Thread.currentThread().getName();
         System.out.println(threadName + " is running");
   balance = newBalance;
  }
  finally{
   balanceChangeLock.unlock();
  }
 }
 public double getBalance(){
  return balance;
 }
 private double balance;
 private Lock balanceChangeLock;
 private Condition sufiicientFundsCondition;
}

package p4;

public class DepositRunnable implements Runnable{
 public DepositRunnable(BankAccount anAccount, double anAmount, int aCount){
  account = anAccount;
  amount = anAmount;
  count = aCount;
 }
 public void run(){
  try{
   for(int i=1; i<=count; i++){
    account.deposit(amount);
    Thread.sleep(DELAY);
   }
  }
  catch(InterruptedException exception){}
 }
 private static final int DELAY = 1;
 private static BankAccount account;
 private double amount;
 private int count;
}

package p4;

public class WithdrawRunnable implements Runnable{
 public WithdrawRunnable(BankAccount anAccount, double anAmount, int aCount){
  account = anAccount;
  amount = anAmount;
  count = aCount;
 }
 public void run(){
  try{
   for(int i=1; i<=count; i++){
    account.withdraw(amount);
    Thread.sleep(DELAY);
   }
  }
  catch(InterruptedException exception) {}
 }
 private static final int DELAY = 1;
 private BankAccount account;
 private double amount;
 private int count;
}

package p4;

public class BankAccountThreadTester {
 public static void main(String[] args) {
  BankAccount account = new BankAccount();
  final double AMOUNT = 100;
  final int REPET = 1000;
 
  DepositRunnable d1 = new DepositRunnable(account, AMOUNT, REPET);
  WithdrawRunnable w1 = new WithdrawRunnable(account, AMOUNT, REPET);
  DepositRunnable d2 = new DepositRunnable(account, AMOUNT, REPET);
  WithdrawRunnable w2 = new WithdrawRunnable(account, AMOUNT, REPET);
 
  Thread t1 = new Thread(d1);
  Thread t2 = new Thread(w1);
  Thread t3 = new Thread(d2);
  Thread t4 = new Thread(w2);
 
  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }

}

package p5;

import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;
import java.util.Random;

public class Ball1
{
 public Ball1(JPanel aPanel)
 {
  panel = aPanel;
  generator = new Random();
  dx = 0; // 공의 x 방향 이동 속력 (sleep 시간 당 픽셀)
  dy = generator.nextInt(MAX_DY) + 1; // y 방향 이동 속력
  color = Color.RED;
  yTop = 0;  // 공의 출발 위치 y 좌표
  xLeft = generator.nextInt(panel.getWidth() - DIAMETER);  // 공의 출발 위치 x 좌표
 }
 
 public void move()
 {
  // 공 이동
  xLeft += dx;
  yTop += dy;
 
  // 만약 벽에 닿았거나 지나쳤으면 반사시킴
  if (xLeft <= 0)  // 왼쪽 벽에 닿은 경우
  {
   dx = -1 * dx;
   xLeft = -xLeft;
  }
  if (xLeft + DIAMETER >= panel.getWidth())  // 오른쪽 벽에 닿은 경우
  {
   dx = -1 * dx;
   xLeft = 2 * (panel.getWidth() - DIAMETER) - xLeft;
  }
 
  if (yTop <= 0) // 위 벽에 닿은 경우
  {
   dy = -1 * dy;
   yTop = -yTop;
  }
  if (yTop + DIAMETER >= panel.getHeight()) //아래 벽에 닿은 경우
  {
   dy = -1 * dy;
   yTop = 2 * (panel.getHeight() - DIAMETER) - yTop;
  }
 
 }
 
 public void draw(Graphics2D g2)
 {
  Ellipse2D.Double ball
  = new Ellipse2D.Double(xLeft, yTop, DIAMETER, DIAMETER);
  g2.setColor(color);
  g2.draw(ball);
 }
 
 public void animate() throws InterruptedException
 {
  while (true)
  {
   move();
   panel.repaint();  // 패널을 다시 그림 (공 전체가 다시 그려짐)
   Thread.sleep(DELAY);
  }  // sleep 시간마다 쓰레드 수 만큼 그림이 새로 그려짐
 } 
 
 public static final int DIAMETER = 20; // 공 직경
 public static final int MAX_DX = 10;   // x 방향 최대 속력
 public static final int MAX_DY = 10;   // y 방향 최대 속력
 public static final int DELAY = 50;    // sleep 주기
 
 private JPanel panel;
 private int dx;  // x 방향 속도, DELAY당 이동 거리
 private int dy;  // y 방향 속도, DELAY당 이동 거리
 private Color color;
 private Random generator;
 private int xLeft;  // 공의 위치
 private int yTop;   // 공의 위치
}

package p5;

import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;

public class BallPanel1 extends JPanel
{
 public BallPanel1()
 {
  setSize(500, 300);
  balls = new ArrayList<Ball1>();
 }
 
 public void paintComponent(Graphics g)
 { 
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  for (Ball1 ball : balls)
   ball.draw(g2);
 }
 
 public void addBall(Ball1 ball)
 {
  balls.add(ball);  // arraylist에 ball을 넣음
  class AnimationRunnable implements Runnable
  {
   public AnimationRunnable(Ball1 ball)
   {
    this.ball = ball;
   }
   
   public void run()
   {
    try
    {
     ball.animate();
    }
    catch (InterruptedException exception)
    {  // Interrupt가  걸리면 run 메소드가 종료되고 쓰레드도 종료
    }
   }
   private Ball1 ball;
  }
 
  // Ball 하나 하나마다 애니메이션을 위한 쓰레드를 실행
  Runnable r = new AnimationRunnable(ball);
  Thread t = new Thread(r);
  t.start();  // 각 쓰레드는 자신이 맡은 공에 animnate를 호출
     // animate 메소드는 무한 루프를 도는 메소드임
 }
 
 private ArrayList<Ball1> balls;
}

package p5;

import javax.swing.JFrame;

public class BallViewer1
{
   public static void main(String[] args)
   {
      JFrame frame = new JFrame();

      final int FRAME_WIDTH = 500;
      final int FRAME_HEIGHT = 300;

      frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      BallPanel1 panel = new BallPanel1();
      frame.add(panel);
      panel.addBall(new Ball1(panel));
      panel.addBall(new Ball1(panel));
      panel.addBall(new Ball1(panel));

      frame.setVisible(true);
   }
}

package p6;

import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;
import java.util.Random;

public class Ball
{

   public Ball(JComponent aComponent)
   {
      component = aComponent;
      generator = new Random();
      dx = generator.nextInt(MAX_DX) + 1;
      dy = generator.nextInt(MAX_DY) + 1;
      color = randomColor();
      yTop = generator.nextInt(component.getHeight() - DIAMETER);
      xLeft = generator.nextInt(component.getWidth() - DIAMETER);
   }
  
   private Color randomColor()
   {
      int c = generator.nextInt(9);
      switch(c)
      {
         case 0: return Color.BLACK;
         case 1: return Color.BLUE;
         case 2: return Color.CYAN;
         case 3: return Color.GREEN;
         case 4: return Color.MAGENTA;
         case 5: return Color.ORANGE;
         case 6: return Color.PINK;
         case 7: return Color.RED;
         case 8: return Color.YELLOW;
      }
      return Color.RED;
   }

   /**
      Moves the ball.
   */
   public void move()
   {
      xLeft += dx;
      yTop += dy;
      if (xLeft <= 0)
      {
       dx = -1 * dx;
       xLeft = -xLeft;
      }
      if (xLeft + DIAMETER >= component.getWidth())
      {
       dx = -1 * dx;
       xLeft = 2 * (component.getWidth() - DIAMETER) - xLeft;
      }

      if (yTop <= 0)
      {
       dy = -1 * dy;
       yTop = -yTop;
      }
      if (yTop + DIAMETER >= component.getHeight())
      {
       dy = -1 * dy;
       yTop = 2 * (component.getHeight() - DIAMETER) - yTop;
      }

   }

   /**
      Draws the ball.
      @param g2 the graphics context
   */
   public void draw(Graphics2D g2)
   {
      Ellipse2D.Double ball
            = new Ellipse2D.Double(xLeft, yTop, DIAMETER, DIAMETER);
      g2.setColor(color);
      g2.draw(ball);
   }
  
   public void animate() throws InterruptedException
   {
      while (true)
      {
         move();
         component.repaint();
         Thread.sleep(DELAY);
      }
   }
  
   public static final int DIAMETER = 20;
   public static final int MAX_DX = 10;
   public static final int MAX_DY = 10;
   public static final int DELAY = 50;
  
   private JComponent component;
   private int dx;  // x 방향 속도, DELAY당 이동 거리
   private int dy;  // y 방향 속도, DELAY당 이동 거리
   private Color color;
   private Random generator;
   private int xLeft;
   private int yTop;
}

package p6;

import javax.swing.JComponent;
import java.util.ArrayList;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class BallComponent extends JComponent

   public BallComponent()
   {
      balls = new ArrayList<Ball>();
   }
  
   public void paintComponent(Graphics g)
   { 
      Graphics2D g2 = (Graphics2D) g;
      for (Ball ball : balls)
         ball.draw(g2);
   }
  
   public void addBall(Ball ball)
   {
      balls.add(ball);
      class AnimationRunnable implements Runnable
      {
         public AnimationRunnable(Ball ball)
         {
            this.ball = ball;
         }

         public void run()
         {
            try
            {
               ball.animate();
            }
            catch (InterruptedException exception)
            {
            }
         }
         private Ball ball;
      }

      // Ball 하나 하나마다 애니메이션을 위한 쓰레드를 실행
      Runnable r = new AnimationRunnable(ball);
      Thread t = new Thread(r);
      t.start();
   }
  
   private ArrayList<Ball> balls;
}

package p6;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.awt.BorderLayout;

public class BallPanel extends JPanel
{
   public BallPanel()
   {
      ballComponent = new BallComponent();
      setLayout(new BorderLayout());
      add(ballComponent, BorderLayout.CENTER);
      createButton();
   }
   private void createButton()
   {
      class ButtonListener implements ActionListener
      {
         public ButtonListener(JComponent aComponent)
         {
            component = aComponent;
         }
        
         public void actionPerformed(ActionEvent event)
         {
            // 버튼이 눌릴 때마다 Ball 객체를 하나 구성하여 ballComponent에 추가함
            ballComponent.addBall(new Ball(component));
         }
        
         JComponent component;
      }

      JButton button = new JButton("Add ball");
      ActionListener listener = new ButtonListener(ballComponent);
      button.addActionListener(listener);
      add(button, BorderLayout.SOUTH);
   }
  
   private BallComponent ballComponent;
}

package p6;

import javax.swing.JFrame;

public class BallViewer
{
   public static void main(String[] args)
   {
      JFrame frame = new JFrame();

      final int FRAME_WIDTH = 500;
      final int FRAME_HEIGHT = 300;

      frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      BallPanel panel = new BallPanel();
      frame.add(panel);

      frame.setVisible(true);
   }
}