[java] 그림판을 만드는데 안되는 부분의-_-이유를 몰르겠어요;
환찬
import java.awt.*;
import java.awt.event.*;
public class PaintFour extends Frame implements ActionListener{
//전역변수들 선언
String str = ;
String text = PaintFour;
Color currentColor = Color.ORANGE;
Point first_point, last_point, old_point;
MenuItem menu_file_new, menu_file_open, menu_file_save, menu_file_exit,
menu_draw_pen, menu_draw_line, menu_draw_ellipse,
menu_draw_rectangle, menu_draw_round_rectangle, menu_draw_text,
menu_effect_color,
menu_effect_fill_solid, menu_effect_fill_gradient, menu_effect_fill_image,
menu_effect_thickness_thin, menu_effect_thickness_thick, menu_effect_shadow;
public PaintFour()
{
//메뉴~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//메뉴바 생성
MenuBar mb = new MenuBar();
/**********************************************************************
File메뉴 생성하고 메뉴바에 등록하기
( new, open, save, exit )
아이템을 [1]생성하기
[2]File메뉴에 붙이기
[3]이벤트처리_리스너등록하기
**********************************************************************/
Menu menu_file = new Menu(파일);
menu_file_new = new MenuItem(새파일);
menu_file.add(menu_file_new);
menu_file_new.addActionListener(this);
menu_file_open = new MenuItem(열기);
menu_file.add(menu_file_open);
menu_file_open.addActionListener(this);
menu_file_save = new MenuItem(저장);
menu_file.add(menu_file_save);
menu_file_save.addActionListener(this);
menu_file_exit = new MenuItem(종료);
menu_file.add(menu_file_exit);
menu_file_exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//종료
System.exit(0);
}
});
//메뉴바에 등록
mb.add(menu_file);
/**********************************************************************
Draw메뉴 생성하고 메뉴바에 등록하기
( pen, line, ellipes, rectangle, round Rectangle, text )
아이템을 [1]생성하기
[2]Draw메뉴에 붙이기
[3]이벤트처리_리스너등록하기
**********************************************************************/
Menu menu_draw = new Menu(그리기);
menu_draw_pen = new MenuItem(연필);
menu_draw.add(menu_draw_pen);
menu_draw_pen.addActionListener(this);
menu_draw_line = new MenuItem(선);
menu_draw.add(menu_draw_line);
menu_draw_line.addActionListener(this);
menu_draw_ellipse = new MenuItem(원);
menu_draw.add(menu_draw_ellipse);
menu_draw_ellipse.addActionListener(this);
menu_draw_rectangle = new MenuItem(사각형);
menu_draw.add(menu_draw_rectangle);
menu_draw_rectangle.addActionListener(this);
menu_draw_round_rectangle = new MenuItem(둥근사각형);
menu_draw.add(menu_draw_round_rectangle);
menu_draw_round_rectangle.addActionListener(this);
menu_draw_text = new MenuItem(글자);
menu_draw.add(menu_draw_text);
menu_draw_text.addActionListener(this);
//메뉴바에 등록
mb.add(menu_draw);
/**********************************************************************
Effect메뉴 생성하고 메뉴바에 등록하기
( color, fill ( fill_solid, fill_gradient, fill_image ),
thickness ( thin, thick ), shadow )
아이템을 [1]생성하기
[2]Effect메뉴에 붙이기
[3]이벤트처리_리스너등록하기
**********************************************************************/
Menu menu_effect = new Menu(효과);
menu_effect_color = new MenuItem(색깔);
menu_effect.add(menu_effect_color);
menu_effect_color.addActionListener(this);
Menu menu_effect_fill = new Menu(채우기);
//Fill메뉴의 서브메뉴(solid, gradient, image)
menu_effect_fill_solid = new MenuItem(단색);
menu_effect_fill.add(menu_effect_fill_solid);
menu_effect_fill_solid.addActionListener(this);
menu_effect_fill_gradient = new MenuItem(그라디언트);
menu_effect_fill.add(menu_effect_fill_gradient);
menu_effect_fill_gradient.addActionListener(this);
menu_effect_fill_image = new MenuItem(이미지);
menu_effect_fill.add(menu_effect_fill_image);
menu_effect_fill_image.addActionListener(this);
//Effect메뉴에 Fill메뉴 등록
menu_effect.add(menu_effect_fill);
Menu menu_effect_thickness = new Menu(굵기);
//Thickness메뉴의 서브메뉴(thin, thick)
menu_effect_thickness_thin = new MenuItem(얇게);
menu_effect_thickness.add(menu_effect_thickness_thin);
menu_effect_thickness_thin.addActionListener(this);
menu_effect_thickness_thick = new MenuItem(굵게);
menu_effect_thickness.add(menu_effect_thffect_thickness_thick);
menu_effect_thickness_thick.addActionListener(this);
//Effect메뉴에 Thickness메뉴 등록
menu_effect.add(menu_effect_thickness);
menu_effect_shadow = new MenuItem(그림자);
menu_effect.add(menu_effect_shadow);
menu_effect_shadow.addActionListener(this);
//메뉴바에 추가
mb.add(menu_effect);
//메뉴바 프레임에 붙이기
setMenuBar(mb);
//메뉴 끝~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//GrimPan클래스로 만든 객체를 프레임 중앙에 붙이기~
add(new GrimPan(), BorderLayout.CENTER);
setBounds(100, 100, 800, 600);
setVisible(true);
}
//ActionEvent처리!!!
public void actionPerformed(ActionEvent e)
{
//메뉴아이템 객체를 얻어오기
MenuItem select = (MenuItem)e.getSource();
//이벤트가 발생한 메뉴아이템의 문자열을 얻어오기
//무엇을 선택했는지~~~~~~~
if(select.equals(menu_file_new)){
str = 새파일;
}
else if(select.equals(menu_file_open)){
str = 열기;
}
else if(select.equals(menu_file_save)){
str = 저장;
}
else if(select.equals(menu_file_exit)){
str = 종료;
}
else if(select.equals(menu_draw_pen)){
str = 연필;
}
else if(select.equals(menu_draw_line)){
str = 선;
}
else if(select.equals(menu_draw_ellipse)){
str = 원;
}
else if(select.equals(menu_draw_rectangle)){
str = 사각형;
}
else if(select.equals(menu_draw_round_rectangle)){
str = 둥근사각형;
}
else if(select.equals(menu_draw_text)){
str = 글자;
}
else if(select.equals(menu_effect_color)){
str = 색깔;
}
else if(select.equals(menu_effect_fill_solid)){
str = 단색채우기;
}
else if(select.equals(menu_effect_fill_gradient)){
str = 그라디언트채우기;
}
else if(select.equals(menu_effect_fill_image)){
str = 이미지채우기;
}
else if(select.equals(menu_effect_thickness_thin)){
str = 얇게;
}
else if(select.equals(menu_effect_thickness_thick)){
str = 굵게;
}
else if(select.equals(menu_effect_shadow)){
str = 그림자;
}
}
class GrimPan extends Canvas implements MouseMotionListener, MouseListener
{
int thickness = 3;
public GrimPan(){
addMouseListener(this);
addMouseMotionListener(this);
}
//마우스이벤트!!!!
public void mouseEntered(MouseEvent me){}
public void mouseExited(MouseEvent me){}
public void mouseClicked(MouseEvent me){}
public void mousePressed(MouseEvent me){
first_point = me.getPoint();
old_point = me.getPoint();
}
public void mouseReleased(MouseEvent me){
last_point = me.getPoint();
repaint();
}
public void mouseDragged(MouseEvent me){
last_point = me.getPoint();
repaint();
}
public void mouseMoved(MouseEvent me){}
/**********************************************************************
update()메서드 오버라이드~
이 함수가 호출될 때 화면을 다시 지우고 그리지 않고
현재 화면에 계속 출력될 수 있도록 paint()메서드를 호출한다.
**********************************************************************/
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
if(first_point != null && last_point != null) {
//연필 선택!!!
if(str.equals(연필)) {
g.setColor(currentColor);
g2.setStroke(new BasicStroke(thickness ,0,0,1.0f,null, 0));
g.drawLine(first_point.x, first_point.y,
last_point.x, last_point.y);
first_point=last_point;
return;
}
//선 선택!!!
if(str.equals(선)) {
g.setColor(Color.WHITE);
g.drawLine(first_point.x, first_point.y,
old_point.x, old_point.y);
g.setColor(currentColor);
g.drawLine(first_point.x, first_point.y,
last_point.x, last_point.y);
}//원 선택!!!
else if(str.equals(원)) {
g.setColor(new Color(255,255,255));
g.fillOval(first_point.x, first_point.y,
old_point.x-first_point.x,
old_point.y-first_point.y);
g.setColor(currentColor);
g.fillOval(first_point.x, first_point.y,
last_point.x-first_point.x,
last_point.y-first_point.y);
}//사각형 선택!!!
else if(str.equals(사각형)) {
g.setColor(new Color(255,255,255));
g.fillRect(first_point.x, first_point.y,
old_point.x-first_point.x,
old_point.y-first_point.y);
g.setColor(currentColor);
g.fillRect(first_point.x, first_point.y,
last_point.x-first_point.x,
last_point.y-first_point.y);
}//둥근 사각형 선택!!!
else if(str.equals(둥근사각형)) {
g.setColor(new Color(255,255,255));
g.fillRoundRect(first_point.x, first_point.y,
old_point.x-first_point.x,
old_point.y-first_point.y,
20, 20);
g.setColor(currentColor);
g.fillRoundRect(first_point.x, first_point.y,
last_point.x-first_point.x,
last_point.y-first_point.y,
20, 20);
}//글자 선택!!!
else if(str.equals(글자)) {
g.drawString(text, last_point.x, last_point.y);
}
//굵기- 얇게 선택!!!
if(str.equals(얇게)){
this.thickness = 1;
}//굵기- 굵게 선택!!!
else if(str.equals(굵게)){
this.thickness = 10;
}
old_point=last_point;
&nb;
}
}
}
public static void main(String[] args){
new PaintFour();
}
}
----------------------------
graimpan클래스 안에
int thickness = 3; 이렇게 기본값주구서요
펜으로 그리면
3의 굵기로 그려지거든요
근데 메뉴에서 얇게나 굵게를 선택하고서
다시 펜을 선택하면
굵기적용이 안되요...그냥 3으로만 그려져요;;
ㅠㅠ왜 그런지;;;
-
니지
우상단의 x 버튼 처리를 안하셨는지 동작을 안하더군요! [종료] 눌러야 프로그램이 꺼지네요!
-
핫와인
연필 사용하다가 굵기 선택하면 다시 연필 클릭해야 사용가능하네요^^
-
얀
int thickness = 3;을 GrimPan 에서 지우고 PaintFour 에 넣어주면 굵기가 바뀌네요!