자바(Java) - 자바 스윙으로 그림판을 만들어보자~!!

안녕하세요

이번 시간에는 자바 스윙으로 간단한 그림판을 만들어 보는 시간을

가지겠습니다.


그림판을 만들기 위해서 소스 코드가 그렇게 긴건 아니지만

클래스 파일(.java)가 3개 정도 필요하더군요.


먼저 결과 화면부터 보겠습니다.

 
 

기본적으로 빨, 초, 파 선 색상을 그릴 수 있게끔 해두었고

경우에 따라..



선을 굵게, 얇게 할 수 있으며

선택적으로 지우거나, 전부 지우게 할 수 있습니다.



또한 색상표를 이용하여 다른 색상의 선을 그릴 수가 있습니다.

자 그럼 어떻게 구현됬는지 소스 코드를 볼까요~!


== MyDrawing.java (메인 컴포넌트가 있는 메인함수 - 실제 마우스 이벤트와 버튼 이베트가 처리 된 곳임 ==

public class MyDrawing extends JFrame {
JPanel p1,p2;
JButton btR, btG, btB, btOpen;
Canvas can; // 부모타입
PaintToolFrame pt;
public MyDrawing(){
super("::MyDrawing::");
pt=new PaintToolFrame();
p1=new JPanel(); add(p1, "North");
p2=new JPanel(){ // 여백주기
public Insets getInsets(){
return new Insets(40,10,10,10);
}
}; add(p2, "Center");
p2.setBackground(Color.lightGray);
btR=new JButton(new ImageIcon("./images/red.png")); p1.add(btR);
btG=new JButton(new ImageIcon("./images/green.png")); p1.add(btG);
btB=new JButton(new ImageIcon("./images/blue.png")); p1.add(btB);
btOpen=new JButton("Paint Tool"); p1.add(btOpen);
can=new MyCanvas(); // 도화지 역할을 하는 컴포넌트 MyCanvas는 can을 상속 받는 자식->원이 갑자기 생김
can.setSize(300, 300); // 도화지 크기
can.setBackground(Color.white); // 도화지 배경색 주기
p2.add(can);
//리스너 부착 -------------------
MyHandler my=new MyHandler();
can.addMouseMotionListener(my); // 캔버스 객체에 마우스모션리스너를 부착한다.
btR.addActionListener(my);
btG.addActionListener(my);
btB.addActionListener(my);
btOpen.addActionListener(my);
//pt버튼(PaintToolFrame 클래스꺼)에도 리스너를 부착하자
pt.btPlus.addActionListener(my);
pt.btMinus.addActionListener(my);
pt.btClear.addActionListener(my);
pt.btAllClear.addActionListener(my);
pt.btColor.addActionListener(my);
pt.btClose.addActionListener(my);
//이번에는 메인에서 안하고 생성자에서 한다
setSize(500,500);
setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/*이벤트소스: 캔버스
* 이벤트: MouseEvent
* 이벤트 핸들러: MouseMotionListener를 구현
* */
class MyHandler implements MouseMotionListener, ActionListener{
public void mouseDragged(MouseEvent e){
setTitle("Drag");
//마우스를 드래그한 지점의 x좌표,y좌표를 얻어와서 can의 x,y 좌표값에 전달한다.
int xx=e.getX(); int yy=e.getY();
setTitle("xx="+xx+", yy"+yy);
((MyCanvas)can).x=xx; ((MyCanvas)can).y=yy;
//paint()는 JVM이 호출해주는 메소드으로 변경x, repaint을 써서 재사용하자
can.repaint();
}
public void mouseMoved(MouseEvent e){
}
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
MyCanvas can2 = (MyCanvas)can;
if(o==btR){
can2.cr=Color.red;
}else if(o==btG){
can2.cr=Color.GREEN;
}else if(o==btB){
can2.cr=Color.blue;
}else if(o==btOpen){
// 새로운 'paintToolJframe' 생성해서 창 열기
//PaintToolFrame pt = new PaintToolFrame(); 여기서 코드 넣으면 매번 프레임 생성 ㅜ
//pt.setSize(400, 400);
pt.pack(); // 크기를 압축해서 보여줌
pt.setLocation(getWidth(),0); //x축만큼 오른쪽으로 창 이동
pt.setVisible(true);
}else if(o==pt.btPlus){
can2.w +=10; can2.h+=10;
}else if(o==pt.btMinus){
if(can2.w>3){ // 버튼을 계속 누르면 아예 안나옴. 최소한의 크기 설정
can2.w -= 10; can2.h -= 10; 
}
}else if(o==pt.btClear)
// 드래그한 지점만 부분 지우기
can2.cr=can.getBackground();
}else if(o==pt.btAllClear){
// 캔버스를 모두 지우기
// Graphics 클래스의 clearRect(x,y,w,h)
Graphics g=can2.getGraphics();
g.clearRect(0, 0, can.getWidth(), can.getHeight());
}else if(o==pt.btColor){
// (Swing에 있음) JColorChooser를 띄워서 선택한 색상으로 그려지도록
Color selCr = JColorChooser.showDialog(null, "색선정", Color.blue); // null=스크린 중앙에 화면 나옴
can2.cr=selCr;
}else if(o==pt.btClose){
// pt만 닫혀지도록
//pt.setVisible(false);-> 눈에 보이지 않는것일뿐임
pt.dispose(); // 시스템 자원을 반납해줌
}
}
}
public static void main(String[] args) {
new MyDrawing(); // 생성자 불러오기
}
}

== MyCanvas.java 그림을 그릴수 있는 나만의 도화지 클래스 ======

public class MyCanvas extends Canvas {
//처음에 까만색 점 안찍히게 하기 위해서 x,y -값 지정
int x=-50; int y=-50; w=7; h=7;
Color cr=Color.black;
@Override
public void paint(Graphics g){
g.setColor(cr);
g.fillOval(x, y, w, h); // x, y 지점에 70,70 크기의 원 그리기
}
@Override
public void update(Graphics g){
paint(g);
}
}

== PaintToolFrame.java 메인 창에서 PaintTool 버튼을 누를 때 나오는 창 화면 ===========

public class PaintToolFrame extends JFrame{

JButton btPlus, btMinus, btClear, btAllClear, btClose, btColor;
JPanel p;
public PaintToolFrame(){
super("::PaintToolFrame::");
Container c=getContentPane();
p=new JPanel();
c.add(p, "Center");
p.add(btPlus=new JButton("크게"));
p.add(btMinus=new JButton("작게"));
p.add(btClear=new JButton("지우기"));
p.add(btAllClear=new JButton("모두지우기"));
p.add(btColor=new JButton("색상"));
p.add(btClose=new JButton("닫기"));
}
}



자바(Java) - 쓰레드(Thread) 예제 part4 - 스레드에 우선순위를 부여해보자~!

안녕하세요

이번 시간에는 자바의 스레드에서 우선순위를 부여하여

실행순서를 바꿀 수 있는 예제를 올려봅니다.


class SnailThread extends Thread{

public SnailThread(String name){
setName(name);
}

@Override
public void run(){
for(int i=0;i<5;i++){
System.out.println(getName()+"스레드가 기어가요");
try{
Thread.sleep(1000);
}catch(InterruptedException e){
break;
}
}
}

}

public class ThreadTest4 {

public static void main(String[] args) {
SnailThread tr1= new SnailThread("첫번째 스레드");
SnailThread tr2= new SnailThread("두번째 스레드");
SnailThread tr3= new SnailThread("세번째 스레드");

//스레드에 우선순위를 부여하여 스케줄러에 영향을 줄 수 있다.
tr1.setPriority(Thread.MIN_PRIORITY); // 우선순위 최소값(1) 할당
tr2.setPriority(Thread.NORM_PRIORITY); // 우선순위 보통값(5) 할당
tr3.setPriority(Thread.MAX_PRIORITY); // 우선순위 최대값(10) 할당

tr1.start(); tr2.start(); tr3.start();

//tr2가 자기와 우선순위가 같거나 높은 스레드에게 양보한다. (낮은 스레드에게 양보를 안한다)
tr2.yield();

/*try{
tr1.join();
tr1스레드가 일을 다 마칠 때 까지 이 메소드를 호출한 스레드(여기서는 메인 스레드)가 block 상태가 된다
}catch(InterruptedException e){
}*/

System.out.println("Hello World~~");
}
}

위의 예제를 실행은 했습니다만..

실제 의도한 바와 다르게 우선순위에 영향이 없더군요

왜 그런지는 모르겠습니다..

어쨋든 결과 화면은 아래와 같습니다





자바(Java) - 쓰레드(Thread) 개념과 예제 part3 - Runnable을 상속받는 경우

안녕하세요

이번 시간에는 자바에서 스레드를 작성하는 두번째 방법..

 java.lang.Runnable 인터페이스를 상속받아 구현하는 방법에 대해

글을 써볼까 합니다.


2> Runnable을 상속받는 경우
역시 run()메소드를 오버라이딩

class Snail implments Runnable  
{  
          public void run(){  
         // 스레드가 할 일을 구성  
         }  
}/////////////////////////  

**응용 프로그램에서는 아래와 같이 사용
Snail r=new Snail();  
Thread tr=new Thread(r);  
tr.start();


자 그럼 위의 지식을 기반으로 간단한 예제 작성해보겠습니답~

class Snail implements Runnable{
String name;

public Snail(String name){
this.name=name;
}

@Override
public void run(){
for(int i=1;i<=5;i++){
System.out.println(name+"스레드가 기어가요~~");
try{
Thread.sleep(1000); // 1초 쉬기
}catch(Exception e){

}
}
}
}

public class ThreadTest3 {

public static void main(String[] args) {

//1) Runnable 객체를 생성
Snail sl1 = new Snail("사과");
Snail sl2 = new Snail("포도");
Snail sl3 = new Snail("딸기");

//2) Thread 객체를 생성할 때 생성자 안에 Runnable 객체를 전달한다
Thread sr1 = new Thread(sl1);
Thread sr2 = new Thread(sl2);
Thread sr3 = new Thread(sl3);

//3) Thread start() 메소드를 호출
sr1.start(); sr2.start(); sr3.start();

}
}

사실 위의 소스도 바로 전에 올렸던 Thread 클래스를 상속 받는 방법과 큰 결과의 차이는 없습니다.

하지만 두가지 방법 다 알면 상황에 맞게 유용하게 쓸 수 있으니

두가지 방법 모두 다 아는게 좋을것 같습니다.


자바(Java) - 쓰레드(Thread) 개념과 예제 part2 - Thread 클래스를 상속받는 방법

안녕하세요

이번 시간에는 자바에서 Thread 클래스를 상속 받아 이벤트를 구현하는 방법을 올려봅니다.


스레드를 작성하는 방법은 2가지가 있습니다.

이번 시간에는 첫번째 방법에 대해 기술하겠습니다.


1> java.lang.Thread 클래스를 상속받아 구현

 1>Thread를 상속받는 경우  
...run()메소드 오버라이딩.  
class SnailThread extends Thread  
{  
          public void run(){    
          //스레드가 할 일을 구성    
          }
}///////////////////////////////

**SnailThread를 사용하는 응용프로그램에서는 아래와 같이 사용한다.
  SnailThread tr=new SnailThread();   tr.start();  

run()을 호출하는 것이 아니라, start()를 호출함으로써 Thread가 실행된다.


자 위의 지식을 기반으로 간단한 예제를 작성해보겠습니다.


public class SnailThread extends Thread{

public SnailThread(String name){
this.setName(name);
}

@Override
public void run(){
for(int i=1;i<=5;i++){
// 스레드는 getName이 있다
System.out.println(this.getName()+"스레드가 기어갑니다");
int sec=(int)(Math.random()*3000+100); // 0.1~3.1 범위
try{
// sleep 하는 사이에 다른 스레드가 실행됨
Thread.sleep(sec);
}catch(InterruptedException e){
System.out.println("예외: "+e);
}

}
}

public static void main(String[] args) {
System.out.println("Hello World~");
//스레드를 작성하면 main에서 스레드를 생성하자
SnailThread tr1=new SnailThread("홀쭉이 달팽이");
SnailThread tr2=new SnailThread("뚱뚱이 달팽이");
SnailThread tr3=new SnailThread("똘똘이 달팽이");

tr1.start(); tr2.start(); tr3.start();

}
}

위의 소스를 실행하면 아래와 같은 화면 결과가 나옵니다.


자바(Java) - 쓰레드(Thread) 개념과 예제 part1

안녕하세요

이번 시간에는 자바에서 굉장히 중요한 개념인

쓰레드(Thread)에 대해 글을 쓸까 합니다.


먼저 쓰레드가 무엇인지 설명하겠습니답~!


Thread란?

=> 하나의 프로세스 안에서 실행되는 명령 흐름 (프로세스 안의 작은 프로그램) 스레드는 자신의 주소공간을 갖지 않고, 실행될 때 그 프로세스의 메모리와 자원을 사용한다.

(<-> 반면 Process란.. .컴퓨터 내에 실행 중인 프로그램을 의미
 프로세스는 각각 독립된 주소공간을 가지고 실행되며, 서로 독립적으로 실행되도록 스케줄링 할 수 있다. )


멀티 스레딩(Multi Threading) : 프로세스 안에서 여러 개의 스레드가 동시 작업하는 것. 즉 한 프로그램 내에서 두 가지 이상의 일을 수행하는 것


일단 여기까지 설명하고 간단하게 스레드 예제를 올려봅니다.

public class test{

public static void main(String[] args) {

int count=Thread.activeCount();
System.out.println("현재 실행중인 스레드 갯수: "+count);

//현재 실행중인 스레드를 반환
Thread tr=Thread.currentThread();
System.out.println("현재 실행중인 스레드 이름: "+tr.getName());

//스레드의 이름을 변경
tr.setName("Hi Thread");
System.out.println("--이름 변경 후----");
System.out.println(Thread.currentThread().getName());
}
}

/*
현재 프로그램에 쓰이는 스레드는 1개 이상 일 수 있다.
* 이럴 때 프로그램의 끝은 main()이 아닐 수도 있다.
* |---------------------------|
* 프로세스 시작                                          끝
*
* |---------------------------|
* 메인 스레드 시작                        끝
*
* |      |스레드시작--|          |
* 메인 시작                                끝
*
* |--------------------|----->|
* 스레드 시작             메인끝    스레드 끝
*/

위의 예제에 대한 결과 화면은 아래와 같습니다~ ^^



자바(Java) - JFrame과 Vector를 활용한 예제

안녕하세요

이번 시간에는 자바에서 JFrame과 Vector를 활용한 예제 소스코드를 올려봅니다.


위의 결과 화면과 같이, 이름과 나이를 입력하고 하단의 Save 버튼을 누르면

벡터에 이름과 나이가 저장이 됩니다.

그리고 Print 버튼을 누르면 저장된 벡터 값이 텍스트 영역에 출력이 되는 예제입니다

이것도 그렇게 어렵지 않으니 쉽게 이해하실수 있습니다

public class test extends JFrame{
JPanel p1,p2,p3;
JTextField tfName, tfAge;
JButton btSave, btPrint;
JTextArea ta;
Vector<day12.Person> v = new Vector<Person>();
public test(){
super("::MySwingGui::");
Container cp = this.getContentPane();
p1=new JPanel();
p2=new JPanel(){
@Override
public Insets getInsets(){
return new Insets(10,10,10,10);
}
}; // 이름없는 클래스(Anonymous class)
p3=new JPanel();
cp.add(p1, "North"); cp.add(p2, "Center"); cp.add(p3, "South");
tfName = new JTextField(15); tfAge = new JTextField(15);
p1.add(tfName); p1.add(tfAge);
tfName.setBorder(new TitledBorder("이름"));
tfAge.setBorder(new TitledBorder("나이"));
p1.setBorder(new LineBorder(Color.cyan, 3)); // 3은 두께를 의미
p1.setBackground(Color.yellow);
//Swing컴포넌트들은 스크롤바가 없다.
//만약 스크롤바가 필요하다면 JScrollPane에 얹어서 사용해야 한다
p2.setLayout(new BorderLayout()); 
ta = new JTextArea(7,30);
p2.add(new JScrollPane(ta), "Center");
p3.add(btSave = new JButton("Save"));
p3.add(btPrint = new JButton("Print"));
btSave.setMnemonic('S'); // ALT+S
btPrint.setMnemonic('P'); // ALT+P 단축키 적용
MyHandler l = new MyHandler();
btSave.addActionListener(l);
btPrint.addActionListener(l);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MyHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
if(o==btSave){
setTitle("Save");
//1. 이름, 나이 입력 값을 얻어오기
String name=tfName.getText();
String ageStr=tfAge.getText();
//1_2. 유효성 체크
int age=0;
try{
age=Integer.parseInt(ageStr.trim());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(ta, "나이는 숫자여야 해요");
tfAge.setText("");
tfAge.requestFocus();  //입력 포커스 가기
return;
}
//2. Person객체를 생성해서 이름과 나이 설정
Person p = new Person(name,age);
//3. v에 Person을 저장하고 ta에 "정보를 저장하였습니다" 를 출력하자
v.add(p);
ta.setText("정보를 저장하였습니다\n");
tfName.setText(""); tfAge.setText("");
tfName.requestFocus();
}else if(o==btPrint){
setTitle("Print");
//반복문 돌면서 v에 저장된 Person의 정보를 ta에 출력한다.
//Iterator<E> iteratorI()메소드 활용해서
//Iterator<Person> it=v1.iterator();
Iterator<Person> it=v.iterator();
ta.setText("");
for(int i=1;it.hasNext();i++){
Person p=it.next();
String info=i+": "+p.getName()+"["+p.getAge()+"세]";
ta.append(info+"\n"); // 줄바꿈
}
}
}
} // inner class

public static void main(String[] args) {
test my = new test();
my.setSize(500, 500);
my.setVisible(true);
}
}

자바(Java) - JFrame을 활용한 간단한 버튼 예제~! 색깔 바꾸기

안녕하세요

이번 시간에는 JFrame을 활용해서 빨간색 버튼을 누르면 패널이 빨갛게 바뀌고, 초록색 버튼을 누르면 초록색으로 바뀌는 예제를 올려봅니다.

결과 화면은 아래와 같습니다.




이 예제도 역시 어려운 예제가 아니라서 간단하게 구현하실 수 있습니다~!!

public class test extends JFrame{
JButton b1,b2;
JPanel p1,p2;
public test(){
super("::MySwing2::");
Container cp=this.getContentPane();
p1=new JPanel(); p2=new JPanel();
cp.add(p1, "North"); cp.add(p2, "Center");
b1=new JButton("Red",new ImageIcon("images/red.png"));
b2=new JButton("Green",new ImageIcon("images/green.png"));
p1.add(b1); p1.add(b2);
p2.setBackground(Color.white);
//이름없는 inner 클래스 (이 방식이 현지에서 많이 쓰이고 안드로이드에서도 많이 쓰임)
b1.addActionListener(new ActionListener(){
//위의 ActionListener 인터페이스를 상속받는 자식 클래스(원래 인터페이스는 new가 허용안됨)
//이름 없는 inner 클래스는 bin 디렉토리에  $1.class 형태로 저장 (숫자1로)
public void actionPerformed(ActionEvent e){
p2.setBackground(Color.red);
}
});
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
p2.setBackground(Color.blue);
}
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
test my=new test();
my.setSize(500, 500);
my.setVisible(true);
}
}

자바(Java) - JFrame 버튼 예제

안녕하세요

이번 시간에는 Frame이 아닌 좀 더 좋은 JFrame을 이용해서

간단한 버튼 예제 소스 코드를 올릴까 합니다.

일단 결과 화면은 아래와 같습니다



버튼이 4개가 있고, 각 버튼을 누를 때 마다 간단한 이벤트가 있습니다.

소스코드도 간단하니 이해하시는데 무리는 없을겁니다~!

public class test extends JFrame{
JButton b1,b2,b3,b4;
ImageIcon icon1,icon2,icon3,icon4,icon5,icon6;
public test(){
super("::MySwing::");
Container cp=this.getContentPane();
cp.setLayout(new GridLayout(1,0)); //1행으로 고정, 열은 add하는 수만큼 가변적으로
icon1=new ImageIcon("images/up.PNG");
icon2=new ImageIcon("images/down.PNG");
icon3=new ImageIcon("images/over.PNG");
icon4=new ImageIcon("images/딸기 쉐이크.png");
icon5=new ImageIcon("images/코카-콜라.png");
icon6=new ImageIcon("images/리코타 치즈 상하이 버거.png");
b1=new JButton("Input",icon1);
b2=new JButton("Message",icon4);
b3=new JButton("Confirm",icon5);
b4=new JButton(icon6);
//add(b1);//swing은 컴포넌트를 직접 JFrame에 부착해선 안되고, ContentPane이라는 컨테이너를 얻어와서 컨텐트페인에 붙여야 한다
//컨텐트 페인의 기본 레이아웃은 BorderLayout
cp.add(b1); cp.add(b2); cp.add(b3); cp.add(b4);
//버튼에 마우스오버시 아이콘 설정
b1.setRolloverIcon(icon3);
//마우스 누를 때 아이콘 설정
b1.setPressedIcon(icon2);
//텍스트의 수직 위치=>top
b2.setVerticalTextPosition(JButton.TOP);
//텍스트의 수평 위치=>center
b2.setHorizontalTextPosition(JButton.CENTER);
b2.setMnemonic('C'); // ALT+C
//b3텍스트 bottom center로 위치
b3.setVerticalTextPosition(JButton.BOTTOM);
b3.setHorizontalTextPosition(JButton.CENTER);
b3.setMnemonic('C'); //Alt+C
b4.setMnemonic('A'); //Alt+A
b4.setToolTipText("이건 풍선 도움말이에요~~"); //마우스를 갖다대면 뜸
MyEventHandler my=new MyEventHandler();
b1.addActionListener(my);
b2.addActionListener(my);
b3.addActionListener(my);
b4.addActionListener(my);
//awt는 창닫기를 WindowEvent 처리를 해주야하지만
//swing은 창닫기 처리를 메소드로 지원함
// 창이 종료될 때 어떤 동작을 할지 결정하는 함수
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//System.exit(0)과 동일
}
class MyEventHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
Object obj = e.getSource();
if(obj==b1){
//JOptionPane의 InputDialog 띄워서 "당신의 이름은?"
//=>사용자가 입력한 이름을 타이틀에 올리기
String str = JOptionPane.showInputDialog(b2, "당신의 이름은?");
setTitle(str);
}else if(obj==b2){
//MessageDialog 띄워서 "반가워요" 메시지를 띄우세요
JOptionPane.showMessageDialog(b2, "반가워요", "오류", JOptionPane.ERROR_MESSAGE,icon1);
}else if(obj==b3){
// ConfirmDialog 띄워서 "종료할까요?"
//"예", "아니오" 버튼만 나오도록
//"예"를 누르면 종료시키기
int result=JOptionPane.showConfirmDialog(b2, "종료할까요?", "확인", JOptionPane.YES_NO_OPTION);
if(result==JOptionPane.YES_OPTION){ //버전업 하면 0이 유효하지 않기 때문에.. JOptionPane.YES_OPTION으로 정정하는게 좋음
System.exit(0);
}
}else if(obj==b4){
//MessageDialog를 띄위되 이미지만 나오도록
//JOptionPane.showMessageDialog(b4, " ", title, messageType, icon1);
JOptionPane.showMessageDialog(b1,"","ImageViewer",JOptionPane.INFORMATION_MESSAGE,icon6);
}
}
}//inner class ///////////////////////
public static void main(String[] args) {
test my=new test();
my.setSize(700, 400);
my.setVisible(true);
}
}

자바(Java) - Frame을 활용하여 로그인 화면 구현하기

안녕하세요

이번 시간에는 자바 Frame을 활용하여 아이디와 패스워드를 입력한 후에 로그인 하여 메인 페이지로 이동하는 것을 구현할까 합니다.

먼저 로그인 화면을 구축하기 전에..

'퐁'씨라는 성을 가진 성만 입장이 허용되고, '콩' 씨라는 성은 절대 입장이 안된다는 예외 처리와, 기타 다른 성씨도 입장이 안된다는 예외 처리를 하는 클래스를 만들까 합니다.

자 소스코드 바로 보실까요~!

//사용자 정의 예외 클래스
class NotSupportedNameException extends Exception{

public NotSupportedNameException(){
super("지원되지 않는 이름입니다.");
}

//오버로드
public NotSupportedNameException(String msg){
super(msg);
}
}

public class PongSite {

public static void login(String name, String pwd) throws NotSupportedNameException{
System.out.println("***Login Page***");
char lastName=name.charAt(0); // 인수 name의 0번째, 즉 성을 체크

if(lastName=='퐁'){
System.out.println(name+"님 환영합니다.");
}else if(lastName=='콩'){
//사용자 정의 예외 발생
throw new NotSupportedNameException("콩씨는 절대로 입장 불가");
/* throw new 예외();
* throw와 throws는 세트로 함께 사용하자.
* */
}else{
//기타 성씨인 경우
throw new NotSupportedNameException("기타 성씨분들은 이용에 제한이 있어요");
// 문자 지우면 6번 super 메시지 출력
}
}

public static void main(String[] args) {
// 명령줄 인수로 이름, 비번을 받자
if(args.length!=2){
System.out.println("명령줄 인수 2개를 입력하세요[이름, 비밀번호]");
return;
}

String name=args[0]; String pwd=args[1];
try{
login(name,pwd); // PongSite의 login 함수로 입력 값 던져주기
}catch(NotSupportedNameException e){
String msg=e.getMessage(); // 예외 메시지를 문자열로 반환한다.
System.out.println(msg);

//스택기록을 출력하여 예외가 발생된 지점을 보여줌(디버깅용으로 사용)
e.printStackTrace();
return;
}

System.out.println(">>>사이트 이용<<<");

}
}

여기서 잠깐 결과 화면을 보여드리고 핵심 소스 코드를 보여드리겠습니다.




화면은 총 2개로 로그인 화면, 메인 화면으로 간단하게 구성했습니다.

저렇게 구현하기 위해 필요한 소스는 아래와 같습니다.

//사용자 정의 예외 클래스
public class MemberApp extends Frame implements ActionListener{
Panel loginP, mainP;
Panel p1,p2,p3;
CardLayout card;
Label lbName, lbPwd;
TextField tfName, tfPwd;
Button btLogin, btReset, btExit;
Button btBack, btExit2; // mainP에 붙이기
//btBack하면 loginP로 돌아가기
//btExit2=>종료
public MemberApp(){
super("::MemberApp::");
card = new CardLayout();
setLayout(card); // 카드레이아웃으로 설정
loginP = new Panel(); mainP = new Panel();
loginP.setBackground(new Color(102,111,123));
mainP.setBackground(Color.lightGray);
add(loginP,"loginP"); add(mainP,"mainP");
p1=new Panel(new BorderLayout());
loginP.add(p1);
p2=new Panel(new GridLayout(2,1,10,10)); // 라벨만 붙인다.
p3=new Panel(new GridLayout(2,1,10,10)); // 텍스트필드만 붙인다.
p1.add(p2, "West"); p1.add(p3, "Center");
p2.add(lbName=new Label("이   름:")); p2.add(lbPwd=new Label("비밀번호:"));
p3.add(tfName=new TextField(20)); p3.add(tfPwd=new TextField(20));
Panel p4=new Panel(); // 버튼 부착
p1.add(p4, "South");
p4.add(btLogin=new Button("Login"));
p4.add(btReset=new Button("Reset"));
p4.add(btExit=new Button("Exit"));
setBackground(new Color(102,111,123));
mainP.add(btBack=new Button("이전으로"));
mainP.add(btExit2=new Button("종   료"));
// 버튼 이벤트 리스너 등록 
btLogin.addActionListener(this);
btReset.addActionListener(this);
btExit.addActionListener(this);
btBack.addActionListener(this);
btExit2.addActionListener(this);
}
@Override // 오버라이드는 부모가 exception을 하지 않았으면 throws를 하지 못한다.
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
if(o==btLogin){
loginCheck();
}else if(o==btReset){
tfName.setText(" ");
tfPwd.setText(" ");
tfName.requestFocus(); // 이름 텍스트 창에 포커스 맞추기
}else if(o==btExit||o==btExit2){
System.exit(0);
}else if(o==btBack){
JOptionPane.showMessageDialog(this, "로그인 페이지로 이동하겠습니다");
card.show(this, "loginP");
setBackground(new Color(102,111,123));
}
}
public void loginCheck(){
//1) tfName, tfPwd로부터 입력한 값 받아오기
String lastName=tfName.getText().trim();
String lastPwd=tfPwd.getText().trim();
//유효성 체크(빈문자열 체크) -> exception으로 처리하자(소스코드로 구현해도 되지만..)
//String 클래스 메소드
//- trim():문자열 앞 뒤에 있는 공백을 제거한다.
//char charAt(int index) : 특정 인덱스의 문자 1자를 반환한다.
//2) 퐁씨만 허용 PongSite.login(name, pwd)
try{
PongSite.login(lastName, lastPwd);
JOptionPane.showMessageDialog(btReset, "로그인을 환영합니다.");
card.show(this, "mainP");
setBackground(Color.lightGray);
}catch(NotSupportedNameException ee){
String message=ee.getMessage();
JOptionPane.showMessageDialog(this, message);
tfName.setText(""); tfPwd.setText(""); tfName.requestFocus();
return;
}catch(java.lang.StringIndexOutOfBoundsException ee){
String message="이름, 비번을 모두 입력하세요";
JOptionPane.showMessageDialog(this, message);
tfName.requestFocus();
return;
}
}
public Insets getInsets(){
return new Insets(70,10,10,20);
}
public static void main(String[] args) {
MemberApp my = new MemberApp();
my.setSize(400, 400); my.setVisible(true);
}
}

자바(Java) - 프레임(Frame)의 마우스 이벤트 기본 예제

안녕하세요

이번 시간에는 자바 프레임(Frame)에서 마우스 이벤트를 활용하는 간단한 예제를 올릴까 합니다.

***********************************************
이벤트 소스 : Frame
이벤트 : MouseEvent
이벤트 핸들러 : MouseListener를 상속받는다.
************************************************



보시다시피 창 화면에 마우스 왼쪽 버튼을 누르면 타이틀에 클릭한 x,y 좌표의 위치가 출력되고 '나를 클릭해보세요' 멘트가 이동합니다.

또한 오른쪽 마우스 버튼을 누르면 Open(O), Save(S) 라는 팝업 메뉴가 뜹니다.

자 그럼 소스코드를 볼까요~

package testtest;

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

//MouseListener는 인터페이스고 추상메소드가 5개이기 때문에, 5개 메소드를 다 구현해야한다.
public class test extends Frame implements MouseListener {

String str="나를 클릭해보세요";
int x=50,y=50;
PopupMenu pm;
MenuItem mi1, mi2;

public test(){
super("::MouseE::");
//팝업메뉴 생성 및 부착
pm=new PopupMenu();
add(pm); //add해도 나타나지 않는다. show()해야 나타남

mi1=new MenuItem("Open(O)"); mi2=new MenuItem("Save(S)");
pm.add(mi1); pm.addSeparator(); pm.add(mi2);

//마우스 이벤트 리스너 부착
this.addMouseListener(this);

}

// MouseListener 5개 추상메소드 구현

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){
//마우스 오른 버튼을 누를때만 팝업메뉴가 뜨도록 처리
if(e.getButton()==MouseEvent.BUTTON3){
pm.show(this, e.getX(), e.getY());
}

}

//Press->Release->Click //반응속도가 제일 빠른 Press
public void mousePressed(MouseEvent e){
x=e.getX(); y=e.getY();
setTitle("x :"+ x +" y : " + y);
repaint();
//paint()메소드는 우리가 호출할 수 없고, JVM이 호출해준다.
//우리는 repaint()를 호출함으로써 JVM이 paint()를 호출하도록 유도할 수 있다.
}

public void mouseReleased(MouseEvent e){}

@Override
public void paint(Graphics g){
g.setColor(Color.BLUE);
g.drawString(str, x, y);
}

public static void main(String[] args) {
test my = new test();
my.setSize(400,400);
my.setVisible(true);

}
}