IO 입출력 예제 part3 - 입력한 문자를 배열에 담아 출력하자

안녕하세요

이번 시간에는 저번 시간에 썼던 예제와 거의 흡사합니다.

자바 io 입출력 예제인데

이번에 배열을 사용하는 예제입니다.




public class Test {

public static void main(String[] args) throws IOException {

int input=0, count=0, total=0;
byte[] data= new byte[6];
//read(배열) => 데이터는 배열(달걀판)에 담긴다.
while((input=System.in.read(data))!=-1){
// 이전 예제에서 input으로 출력했지만, 이번에는 data를 출력해야한다.
// System.out.write(input);[x] 아무것도 안나옴
// input=> 달걀갯수(달걀판에 담긴 달걀 갯수)
System.out.write(data,0,input);
//달걀판을 내보내자(0부터 달걀갯수까지=> 이전의 쓰레기 값 출력이 안된다)

count++; // 반복문 횟수
total+=input; // 총 바이트 수

}

System.out.println(total+"바이트 읽고 씀");
System.in.close(); System.out.close();

}

}


결과 화면도 그 전 예제와 동일하나,

배열을 써서 활용했다는 거에 의의를 둡시다




IO 입출력 예제 part2

안녕하세요

이번 시간에는 이전에 했던 자바 IO 입출력을 아주 살짝 응용한 예제입니다.

따라서 이해하시는데 큰 어려움이 없을겁니다.


public class Test {

public static void main(String[] args) throws IOException {

int input=0, count=0; // 몇바이트 받았는지 count 변수

//ctrl+c를 누르기 전까지 계속 무한 루프
while((input=System.in.read())!=-1){

//Enter값 2바이트 플러스
//System.out.println((char)input);
System.out.write(input); // 위의 소스와 동일한 효과
count++;
}

System.out.println(count+"바이트 입력받음");

//노드 연결 닫음
System.in.close(); System.out.close();

}

}

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


일단 'abcd' 라는 문자를 입력했을 때 6바이트를 입력받았다고 합니다

그 이유는 영문자는 1바이트로 받기 때문에 'abcd'는 총 4바이트입니다.

그렇다면 나머지 2바이트의 정체는 무엇일까요??


정답은 Enter 키 입니다.

Java에서 Enter는 \r + \n 으로 총 2바이트입니다.


그 밑에 '가나다'가 8바이트인 이유는 자바에서 한글은 2바이트여서

'가나다'는 총 6바이트.

그리고 Enter 키 까지 합쳐서 총 8바이트가 나오는 것입니다.


IO 입출력 예제 part1

안녕하세요

이번 시간에는 본격적으로 자바 io 입출력 예제를 올려봅니다.

일단 저도 처음 배운거라 익숙하지가 않아서 해메네요.

그래서 쉬운 예제부터 올리겠습니다.


* System.in : InputStream 타입
 * [1] 1byte 기반 스트림
 * [2] Node 스트림( 키보드와 노드 연결)
 *  // 주요 메소드
 *  public int read() : 바이트 입력을 리턴하고 Ctrl+c 또는 Ctrl+d(리눅스)를 입력하면 -1을 반환한다
 *  public int read(byte[] data) : 데이터를 바이트 배열에 담아서 읽어들인다.
 *
 * */
public class InputStreamTest {

public static void main(String[] args) throws IOException {

System.out.println("입력하세요=>");
while(true){
int input=System.in.read();
System.out.println(input);
// Enter 때문에 13이 출력 / 10()이 출력
// 무한루프기 때문에 Ctrl+c를 누르면 -1을 반환하면서 무한루프를 빠져나온다.
}
}

}

소스가 참 간단하죠? 설명은 주석 부분으로 달아놨으니 이해하시는데

어려움은 없으실겁니다.

위의 소스 코드를 실행하면 아래와 같습니다.

(참고로 io 입출력 예제 할 때 도스창에서 하는게 좋아서 도스창에서 실행했씁니다)




자바(Java) - io 입출력 개념 및 특징 설명

안녕하세요

어제 자바 글을 좀 썼어야 했는데

컴퓨터에 이상이 생기는 바람에 못썼습니다.


이번 시간에는 자바에서 잘 활용되는 io 입출력에 대해 글을 쓸까 합니다.

일단 아래에 개념적인 내용을 쓰겠습니다.

IO
/////////////////////////////////////////////////
1. Stream이란?
   1] Data Source (File, 키보드, 원격 컴퓨터) : 데이터의 근원
   2] Data Destination (파일, 모니터, 프린터, 메모리) : 데이터가 최종적으로 도착하는 곳

   데이터 소스ㅇ=====>ㅇ 프로그램 ㅇ======>ㅇ 데이터 목적지
                   입력스트림                         출력스트림

ex) System 클래스의 InputStream 타입의 클래스 변수: in
        PrintStream 타입의 클래스 변수: out/err

 2. Stream 의 특징
1] FIFO구조(First In First Out)
2] 단방향
3] 스트림에 들어간 데이터가 처리되기 전에는
  스트림을 사용하는 스레드는 블럭킹 상태에 빠진다.
        4] 유연한 구조

3. 스트림의 구분
    1] 스트림에서 다루는 데이터가 무엇이냐에 따른 구분
|
+---byte 기반 스트림(1byte 단위로 데이터가 이동)
| .....> XXXInputStream/OutputStream
+---char 기반 스트림(2byte 단위로 데이터가 이동)
  ......> XXXReader/Writer

2] 스트림 안에 들어온 데이터를 그대로 보내느냐,
   아님 가공 절차를 거친 뒤 보내느냐에 따른 구분
|
+---Node 스트림: 데이터 소스와 직접 연결가능한 스트림
|  cf> 날달걀을 그대로 내보내는 스트림
+---Filter 스트림: 데이터 소스에 직접 연결은 불가능하고 데이터 소스에                         직접 연결한  노드 스트림을 가공하는 역할을 하는 스트림이다.
 cf> 날달걀을 가공해서 가령, 맥반석 달걀로, 또는 달걀 후                           라이 등으로 만들어 보냄 ...따라서 노드스트림과 연결해서 사용해야함.


아래에 위의 설명을 좀 요약한 그림이 있으니 참고하시길 바랍니다



자바(Java) - Swing에서 JTabbedPane을 활용한 간단한 예제

안녕하세요

요새 공부를 좀 밀렸더니 새벽까지 글을 쓰네요 ㅋ

역시 하루 공부는 밀리지 않고 마무리 해야겠씁니다


이번 시간에는 정말 너무 짧아서 금방 끝납니다 ㅋ

JTabbedPane을 활용한 간단한 예제인데 코드도 짧고 쉽습니다

그냥 이런게 있다 정도로만 보시면 될 것 같습니다


그럼 소스 코드 바로 보시죠~

public class MyJTabbedPaneDemo extends JFrame {

JTabbedPane tp;
JLabel lb;
JTextArea ta;

public MyJTabbedPaneDemo(){
super("::MyJTabbedPaneDemo::");
Container cp=this.getContentPane();
// 탭을 갖는 패널(탭을 왼쪽에 붙임)
tp=new JTabbedPane(JTabbedPane.LEFT);
cp.add(tp, "Center");
lb=new JLabel(new ImageIcon("images/스프라이트.png"));
tp.add(lb, "상품이미지");

ta=new JTextArea("문의사항");
tp.add(new JScrollPane(ta), "QnA");

setSize(500, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {

new  MyJTabbedPaneDemo();

}

}

정말 짧죠? ㅋ

위의 소스 코드를 실행하면 아래와 같은 화면이 나오게 됩니다




자바(Java) - MVC 패턴과 JList를 활용하여 프로그램 만들기

안녕하세요

이번 시간에는 MVC 패턴과 JList를 이용하여 간단한 예제 한번 만들어봅니다.


MVC 패턴에 대해서 저는 사실 처음 들었는데,

MVC란 Model, View, Controller의 약자로

Model은 데이터를 갖는 부분을 말하며,
View는 화면에 보여주는 부분(UI),
Controller는 Model과 View를 제어하는 부분

이렇게 세개로 분리하여 개발하는 것을 MVC 패턴을 사용했다고 합니다.


자 그럼 MVC 패턴과 JList를 활용한 예제 소스 코드를 올려봅니다.


public class JListDemo extends JFrame {

JList lst1, lst2; // View
String[] data={"Windows","Unix","Linux","Mac"}; //데이터=>자료구죠=>모델이 갖는다
DefaultListModel<String> model; // Model

//MVC의 장점은 리스트였던 형태를 다른 형태로 바꾸려고 하면, 소스를 전부 다 바꾸지 않고 껍데기만 바꾸면된다.
JComboBox combo1; // View
DefaultComboBoxModel<String> model2; // Model

JButton bt;
Vector<String> v=new Vector<String>();

public JListDemo() {
super("::JListDemo::");
Container cp=getContentPane();
cp.setLayout(new GridLayout(1,0));
lst1=new JList(); //View
cp.add(new JScrollPane(lst1));

model=new DefaultListModel<String>(); // Model이 data를 갖는다.
for(String item:data){
model.addElement(item);
}

//model과 view를 연결
lst1.setModel(model);

JPanel p = new JPanel();
cp.add(p);
combo1=new JComboBox(); // view
p.add(combo1);

model2=new DefaultComboBoxModel(data); // Model

//model과 view를 연결
combo1.setModel(model2);

bt=new JButton("대화참여");
p.add(bt);

bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String chatName=JOptionPane.showInputDialog(p,"대화명을 입력하세요");
setTitle(chatName);
//lst2에 사용자가 입력한 대화명이 올라가도록 해보세요
//벡터에 추가를 해야함
v.add(chatName); // 데이터 추가(보여지진 않음)
//v=> 모델이 가짐
lst2.updateUI(); // 갱신해야 데이터가 반영됨(리스트에 추가 된 데이터가 보여짐)
}
});

lst2=new JList(v);
//생성자에 데이터를 넘기면 알아서 ListModel에 해당 데이터를 전달한다.
cp.add(new JScrollPane(lst2));
lst2.setBorder(new LineBorder(Color.red,3));

setSize(500, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {

new JListDemo();

}

}

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





자바(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);
}
}