본문 바로가기
개발 관련/JAVA 수업

awt란 - 캔버스 - 각 기초 13일차

by 달달한 강냉이 2011. 9. 27.

awt는 기초공사다.

Label : 레이블은
 사각형의 scope에 문자열을 표시할 때 사용하는 Component이다.
 Label은 경계선이 없고 특별한 상태를 가지지도 않는다.  그러므로 Label을 Container에 포함시키게 되면 Label의 문자만 화면에 표시가 된다.
 Label의 문자열은 좌, 우, 중앙으로 정렬시킬 수 있다.

 

레이블 예제 못참음...ㅡㅡ 아 맨날 혼자예제해... 짜증.. 니가공부하냐

 

--------------------------------
--------------------------------
//레이블을 왼쪽 오른쪽 센터로 할건지 보는 예제
[LabelEx.java]
import java.awt.*;
public class LabelEx{
public static void main(String[] args){

Frame f=new Frame("레이블 테스트");
Panel p=new Panel();
Label label1=new Label("연습레이블1");
Label label2=new Label("연습레이블2", Label.CENTER);
Label label3=new Label("연습레이블3", Label.LEFT);
Label label4=new Label("연습레이블4", Label.RIGHT);

label1.setBackground(Color.red);
label2.setBackground(Color.red);
label3.setBackground(Color.red);
label4.setBackground(Color.red);

p.add(label1);
p.add(label2);
p.add(label3);
p.add(label4);
f.add(p);

f.setSize(300,100);
f.setVisible(true);
}
}


--------------------------------
--------------------------------
//아이디랑 패스워드 명칭만 넣어서 위치 잡아주는 예제

import java.awt.*;
class LabelTest {
 public static void main(String args[]) {
  Frame f = new Frame("Login");
  f.setSize(300, 200);
  f.setLayout(null);
  Label id = new Label("ID :"); 
  id.setBounds(50, 50, 30, 10); // 앞의 숫자 두개가 좌표 뒤의 두개가 크기
  
  Label pwd = new Label("Password :");
  pwd.setBounds(50, 65, 100, 10);
  f.add(id); 
  f.add(pwd);
  f.setVisible(true);
 }
}


--------------------------------
--------------------------------


Canvas : 그림을 그릴수있는 도화지라고보면된다.// 특정한 모양을 갖고 있지 않고 사각형의 scope만을 갖고 있는 Component.  그림을 그릴 수 있는 도화지의 역할을 하는 Component로 Container에 포함되어 Graphic 처리를 할 수 있다.
 update(Graphics g) : 무언가 움직이는 것을 그릴때 사용
 paint(Graphics g) : 도화지에 그림을 그리는 툴 그래픽스 라고 하는 클래스안에 전부있다.
 
--------------------------------
--------------------------------
//그림을 그리는 예제

class MyCanvas extends Canvas
{
public void paint(Graphics g){
g.setColor(Color.red);
g.drawRect(20,20,100,100);
}
}

 

//그림을 그리는 예제
[CanvasEx.java]

import java.awt.*;

public class CanvasEx{
public static void main(String[] args){

Frame f=new Frame("Canvas 테스트");
MyCanvas canvas=new MyCanvas();

canvas.setBackground(Color.yellow);

f.add(canvas); // 캔버스를 프레임에 붙이다.
f.setLocation(300,300);
f.setSize(200,200);
f.setVisible(true);
}
}


--------------------------------
--------------------------------
TextComponent
 Text를 다루는 class의 super class로 Text를 처리하는 method를 제공.
 독립적으로는 생성되지는 못한다.

getText( ) 텍스트 컴포넌트가 가지고 있는 텍스트를 얻어온다.

TextField 문자 한 줄만 입력받을 때 사용한다.

TextArea 여러 줄의 문자를 입력받을 때 사용한다.

 


TextField
한 줄 내의 Text를 입력 받거나 편집할 수 있는 Component.
한 줄에 표시할 수 있는 Column(크기)수를 지정할 수 있고 Echo Character를 지정하면 입력되는 문자대신 Echo Character(변환시켜서)로 지정한 문자로 출력된다.

 

TextArea
여러 줄의 Text를 사용자로부터 입력받거나 편집할 수 있는 Component.
화면에 출력되는 scope이 벗어나면 Scrollbar 표시 방식에 따라 자동으로 Scrollbar가 생성된다.
사용자가 필요에 따라 일부 Scrollbar만 나타나게 할 수도 있다.

 

 

 

--------------------------------
--------------------------------

//아이디 비번 입력 받는 예제


[TextFieldEx.java]
import java.awt.*;
public class TextFieldEx{
public static void main(String[] args){

Frame f=new Frame("텍스트필드 테스트");
Panel p=new Panel();

TextField tf1=new TextField("아이디 입력",12); //12자 입력받는 크기로 필드로 보여주겠다는 뜻
TextField tf2=new TextField("암호 입력", 10);

tf1.selectAll(); //마우스를 드래그했을때 블록잡혀있는 상태로 나오도록해준다. 바로 입력하면 들어갈수 있게
tf2.selectAll();

tf2.setEchoChar('*'); //암호를 입력할때 별표로 표기하도록하라.
p.add(tf1);
p.add(tf2);
f.add(p);
f.setSize(300,100);
f.setVisible(true);
}
}


--------------------------------
--------------------------------


[TextAreaEx.java]
import java.awt.*;
public class TextAreaEx{
public static void main(String[] args){
Frame f=new Frame("TextArea Test");
Panel p=new Panel();
TextArea ta1=new TextArea("default",5,30); //크기가 5 다섯줄을 입력할수 있다라는 것을 나타앰. 30자를 입력할수 있는 크기를 보여준다.
TextArea ta2=new TextArea("Vertical Scroll",10,25, TextArea.SCROLLBARS_VERTIC //10줄 입력할수 있는 크기. 25자를 입력할수 있는 크기 , 스크롤바가 튀어나오게 끔 만들어주고 있다. 수평 수직 스크롤바가 있으면 엔터를 누르기 전까지 줄바꿈이 안되나 없으면 자동 줄바꿈이 된다.
p.add(ta1);
p.add(ta2);
f.add(p);
f.setSize(300,300);
f.setVisible(true);
}
}

--------------------------------
--------------------------------

import java.awt.*;

class TextFieldTest {
 public static void main(String args[]) {
  Frame f = new Frame("Login");
  f.setSize(400, 65);
  f.setLayout(new FlowLayout()); // LayoutManager를 FlowLayout으로 한다.

  Label lid = new Label("ID :", Label.RIGHT); // 정렬을 오른쪽으로.
  Label lpwd = new Label("Password :", Label.RIGHT);

  TextField id = new TextField(10); //약 10개의 글자를 입력할 수 있는 TextField 생성
  TextField pwd = new TextField(10);
  pwd.setEchoChar('*'); // 입력한 값 대신 '*'가 보이도록 한다. // 패스워드가 연동되는

  f.add(lid); // 생성한 컴포넌트들을 Frame에 포함시킨다.
  f.add(id);
  f.add(lpwd);
  f.add(pwd);
  f.setVisible(true);
 }
}

 

--------------------------------
--------------------------------
//아이디와 비밀번호를 쳤을떄 오류 화면 띄우고 맞으면 넘어가는 로직


import java.awt.*;
import java.awt.event.*;
class TextFieldTest2 extends Frame { // 프레임 상속
 Label lid; // 레이블 하나 밑에 둘
 Label lpwd;
 TextField tfId; // 텍스트 필드 하니 ㅁ;ㅌㅇ[ 들
 TextField tfPwd;
 Button ok;
 TextFieldTest2(String title) {
  super(title); // Frame(String title)을 호출한다. // 타이틀 설정
  lid = new Label("ID :", Label.RIGHT); // Label의 text정렬을 오른쪽으로.
  lpwd = new Label("Password :", Label.RIGHT);
        // 약 10개의 글자를 입력할 수 있는 TextField 생성.
  tfId = new TextField(10); 
  tfPwd = new TextField(10);
  tfPwd.setEchoChar('*'); // 입력한 값 대신 '*'이 보이게 한다.
  ok = new Button("OK");
  // OK버튼과 TextField에 이벤트처리를 위한 Listener를 추가해준다.
  tfId.addActionListener(new EventHandler()); // 아이디에다가 액션을 줌. 엔터를 ㅈ치면 이벤트를 잡아내서 (new EventHandler()에 있는 클래스가 처리합니다.
  tfPwd.addActionListener(new EventHandler());

  ok.addActionListener(new EventHandler());
  setLayout(new FlowLayout()); // LayoutManager를 FlowLayout으로
  add(lid); // 생성한 Component들을 Frame에 포함시킨다.
  add(tfId);
  add(lpwd);
  add(tfPwd);
  add(ok);
  setSize(450, 65);
  setVisible(true); // Frame이 화면에 보이게 한다.
 }
 public static void main(String args[]) { //이 메인메소드가 하는 역할은 객체생성하는게 다.
  TextFieldTest2 f = new TextFieldTest2("Login");
 }
 class EventHandler implements ActionListener { // 액센 리너스를 연결. 인터페이스를 구현할.
  public void actionPerformed(ActionEvent e){ // actionPerformed(ActionEvent e)를 오버라이딩
   String id = tfId.getText();  // tfId에 입력되어있는 text를 얻어온다. // 겟 텍스트를 가져와서
   String password = tfPwd.getText(); // 이렇게 표현합니다??
   if (!id.equals("java")){    
    System.out.println("입력하신 id가 유효하지 않습니다. 다시 입력해 주세요.");
    // id를 다시 입력할 수 있도록, focus를 tfId로 옮긴다.
    tfId.requestFocus();        // 아이디를 잘못입력하면 여기로 다시 커서가 가도록
    tfId.selectAll();    // tfId에 입력된 text가 선택되게 한다.
   } else if (!password.equals("111")) { //패스워드가 111이 아니면 에러가 나게끔
    System.out.println("입력하신 비밀번호가 틀렸습니다. 다시 입력해 주시기 바랍니다.");
    
                             // id를 다시 입력할 수 있도록 focus를 tfId로 옮긴다.
    tfPwd.requestFocus();
    tfPwd.selectAll();
   } else {
    System.out.println( id + "님, 성공적으로 로그인 되었습니다.");
   }}} }

--------------------------------
--------------------------------
//간단한 하고싶은말을 적어라라고 만든 예제

import java.awt.*;

class TextAreaTest {
 public static void main(String args[]) {
  Frame f = new Frame("Comments");
  f.setSize(400, 220);
  f.setLayout(new FlowLayout());

  TextArea comments = new TextArea("하고 싶은 말을 적으세요.", 10, 50);

  f.add(comments);
  comments.selectAll();  // TextArea의 text 전체가 선택 되도록 한다.
  f.setVisible(true);
 }
}


--------------------------------
--------------------------------
//채팅형식(그러나 채팅 주고 받는 로직하고는 전혀다르다.)
//어펜드 : 덧붙여라

import java.awt.*;
import java.awt.event.*;
class TextComponentEventTest extends Frame { //프레임을 상속받음
 TextField tf = new TextField(); //new TextField(); 밑에 생성하기 때문에 이렇게 만드는것이 더낫다.
 TextArea ta = new TextArea();  // new TextArea();
 TextComponentEventTest(String title) {
  super(title);  //타이틀설정
  tf = new TextField(); //객체생성
  ta = new TextArea(); //객체생성
  add(ta, "Center"); // 텍스트 에어리는 센터
  add(tf, "South"); // 이건 아웃에 붙여주겠다는 뜻
  tf.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    ta.append(tf.getText() + "\n"); //어펜드에 입력해서 텍스트 입력을 가져다가(입력을 하면 텍스트 필드에 출력 채팅형식)
    tf.setText(""); 
    tf.requestFocus();
   }});
  ta.setEditable(false); //에디터불 입력수정이라는 뜻. 에디터 펄스를 주었으니 보기만하는것.
  setSize(300, 200);
  setVisible(true);
  tf.requestFocus(); 
 }
 public static void main(String args[]) {
            TextComponentEventTest mainWin =
                                 new TextComponentEventTest("TextComponentEventTest");
 }   }


--------------------------------
--------------------------------
//텍스트 에디터 9/23 아직 안배운 부분

 

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

class TextEditor extends Frame {
 String fileName;
 TextArea content;
 MenuBar mb;
 Menu mFile;
 MenuItem miNew, miOpen, miSaveAs, miExit;

 TextEditor(String title) {
  super(title);
  content = new TextArea();
  add(content);

  mb  = new MenuBar();
  mFile = new Menu("File");

  miNew   = new MenuItem("New");
  miOpen  = new MenuItem("Open");
  miSaveAs = new MenuItem("Save As...");
  amiExit   = new MenuItem("Exit");

  mFile.add(miNew);
  mFile.add(miOpen);
  mFile.add(miSaveAs);
  mFile.addSeparator(); // 메뉴 분리선(separator)을 넣는다.
  mFile.add(miExit);

  mb.add(mFile);             // MenuBar에 Menu를 추가한다.
  setMenuBar(mb);            // Frame에 MenuBar를 포함시킨다.

  // 메뉴에 이벤트 핸들러를 등록한다.
  MyHandler handler = new MyHandler();
  miNew.addActionListener(handler);
  miOpen.addActionListener(handler);
  miSaveAs.addActionListener(handler);
  miExit.addActionListener(handler);

  setSize(300, 200);
  setVisible(true);
 }

 // 선택된 파일의 내용을 읽어서 TextArea에 보여주는 메서드
 void fileOpen(String fileName) {
  FileReader fr;
  BufferedReader br;
  StringWriter sw;

  try {
   fr = new FileReader(fileName);
   br= new BufferedReader(fr);
   sw = new StringWriter();

   int ch = 0;
   while ((ch=br.read())!=-1) {
    sw.write(ch);                  
   }
   br.close();
   content.setText(sw.toString());
  } catch(IOException e) {
   e.printStackTrace();            
  }
 } // fileOpen메서드의 끝

 // TextArea의 내용을 지정된 파일에 저장하는 메서드
 void saveAs(String fileName) {
  FileWriter fw;
  BufferedWriter bw;
  try {
   fw = new FileWriter(fileName);
   bw= new BufferedWriter(fw);
   bw.write(content.getText());       // TextArea의 내용을 파일에 저장한다.
   bw.close();
  } catch (IOException ie) {
   ie.printStackTrace();
  } // try
 } // saveAs메서드의 끝

 public static void main(String args[]) {
  TextEditor mainWin = new TextEditor("Text Editor");
 }       // main메서드의 끝

 // 메뉴를 클릭했을 때 메뉴별 처리코드
 class MyHandler implements ActionListener {
  public void actionPerformed(ActionEvent e) {
   String command = e.getActionCommand();

   if(command.equals("New")) {
    content.setText("");
   } else if(command.equals("Open")) {
    FileDialog fileOpen = new FileDialog(TextEditor.this, "파일열기");
    fileOpen.setVisible(true);
    fileName = fileOpen.getDirectory() + fileOpen.getFile();
    System.out.println(fileName);
    // 선택된 파일의 내용을 TextArea에 보여준다.
    fileOpen(fileName);
   } else if(command.equals("Save As...")) {
    FileDialog fileSave = new FileDialog(TextEditor.this,"파일저장",FileDialog.SAVE);
    fileSave.setVisible(true);
    fileName = fileSave.getDirectory() + fileSave.getFile();
    System.out.println(fileName);
    // 현재 TextArea의 내용을 선택된 파일에 저장한다.
    saveAs(fileName);
   } else if(command.equals("Exit")) {
    System.exit(0);       // 프로그램을 종료시킨다.
   }
  }
 } // class MyHandler
}       // TextEditor클래스의 끝


--------------------------------
--------------------------------

Menu Component
 Menu는 보통 최상위 Level의 window Titlebar 아래에 존재하는 것으로 User가 Program의 기능을 선택할 수 있도록 해주는 기능을 가지고 있는 Component.
 Menu의 구성은 MeunBar, Menu, MenuItem으로 구성된다.

 

Menu 사용법 (순서는 관계없다.)
1. MenuBar Object를 생성.
   MenuBar mb = new MenuBar();

2. MenuBar에 삽입할 Menu를 생성한 후 Menu를 MenuBar에 붙인다.
 Menu menu_file =  new Menu(“파일”);
 mb.add(menu_file);

3. Menu에 붙일 MenuItem을 생성한 후 해당 Menu에 붙인다.
 MenuItem menu_file_new = new MenuItem(“새문서”);
 Menu_file.add(menu_file_new);

4. MenuBar를 window에 붙인다.
 setMenuBar(mb);

--------------------------------
--------------------------------
//메뉴 만드는 방법
//이걸 사용해서 노트패드에 있는 메뉴바정도를 만들어보자.

import java.awt.*;
class MenuTest {
 public static void main(String args[]) {
  Frame f = new Frame("Frame with Menu");
  f.setSize(300, 200);
  MenuBar mb = new MenuBar();
  Menu mFile = new Menu("File");
  MenuItem miNew = new MenuItem("New");
  MenuItem miOpen = new MenuItem("Open");
  Menu mOthers = new Menu("Others");     // MenuItem이 아니라 Menu임에 주의
  MenuItem miExit = new MenuItem("Exit");

  mFile.add(miNew);  // Menu에 MenuItem들을 추가한다.
  mFile.add(miOpen);
  mFile.add(mOthers);  // Menu에 Menu를 추가한다.
  mFile.addSeparator(); // 메뉴 분리선을 넣는다. 구부선들
  mFile.add(miExit);

  MenuItem miPrint = new MenuItem("Print ..."); // 메뉴 아이템을 만든다.
  MenuItem miPreview = new MenuItem("Print Preview");
  MenuItem miSetup = new MenuItem("Print Setup ...");
  mOthers.add(miPrint);
  mOthers.add(miPreview);
  mOthers.add(miSetup);

  Menu mEdit = new Menu("Edit"); // 메뉴 에디트 밑에 뷰 헬프를 만든다.
  Menu mView = new Menu("View");
  Menu mHelp = new Menu("Help");
  CheckboxMenuItem miStatusbar = new CheckboxMenuItem("Statusbar"); // /스테이스바 를 만든다음에
  mView.add(miStatusbar); // 여기다 스테이스바를 붙여준다.
  mb.add(mFile);   // MenuBar에 Menu를 추가한다.
  mb.add(mEdit);
  mb.add(mView);
  mb.setHelpMenu(mHelp); // mHelp를 HelpMenu로 지정한다.
  f.setMenuBar(mb);  // Frame에 MenuBar를 포함시킨다.
  f.setVisible(true);
 }
}

 

--------------------------------
--------------------------------
//팝업메뉴 만드는 로직

 


import java.awt.*;
import java.awt.event.*;  // 이벤트 처리를 위해서 추가했다.
class PopupMenuTest {
 public static void main(String args[]) {
  final Frame f = new Frame("PopupMenu Test");
  f.setSize(300, 200);
  final PopupMenu pMenu = new PopupMenu("Edit"); // 팝업메뉴 객체를 생성
  MenuItem miCut = new MenuItem("Cut");
  MenuItem miCopy = new MenuItem("Copy");
  MenuItem miPaste = new MenuItem("Paste");
  pMenu.add(miCut);  // PopupMenu에 MenuItem들을 추가한다.
  pMenu.add(miCopy);
  pMenu.add(miPaste);
  f.add(pMenu);   // PopupMenu를 Frame에 추가한다.

  f.addMouseListener( new MouseAdapter() { //마우스 이벤트 중에 마우스어댑터가 가지는(누른 이벤트가 발생을 하면처리르 할껀데)
   public void mousePressed(MouseEvent me) { // 오른쪽 버튼을 누르면
                // 오른쪽 마우스버튼을 누르는 경우에만 PopupMenu를 화면에 보여준다.
    if(me.getModifiers() == me.BUTTON3_MASK) 
     pMenu.show(f, me.getX(), me.getY()); //팝업메뉴가 나오게한다.
   }  
  });
  f.setVisible(true);
 }
}

 


--------------------------------
--------------------------------


LayoutManager  : 레이아웃의 매니저는 어떤식으로 배치할까라는 뜻 수치상으로 좌표점 잡아서 위치 시키겠다. (임의로 레이아웃을 수동으로 할수 있다.)

 Container는 자기 자신에 Component를 붙일 때 어디에, 어떤 방식으로 배치하여 붙일것인가를 이미 결정하고 있다.
 미리 정해진 Layout에 따라 Component들을 자동으로 배치하는 기능을 가지고 있는 Object를 Container들은 가지고 있는데 이것을 Layout Manager라 한다.
 Java에서 사용하는 Layout Manager는 FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout의 5가지가 있다.
 Layout Manager는 각자 다른 방식으로 배치기능을 가지고 있으며 Container는 기본적으로 하나의 Layout Manager를 가지고 있다.
 사용자가 임의로 Layout Manager는 다시 설정할 수 있으며 Layout Manager를 제거하고 수동으로 좌표를 이용해서 배치할 수도 있다.


FlowLayout  : 플로우 레이아웃은 순서대로 늘어놓는 배치 기능을 가지고 있다. 여백은 갭이라고 부란다.
 Component들을 수평으로 순서대로 늘어놓는 배치 기능을 가지고 있다.
 처음에 배치를 하게되면 상단, 중앙부터 배치가 되는데 배치를 하다가 더 이상 배치할 공간이 없으면 자동으로 다음 줄로 이동하여 배치하게 된다.
 Component를 배치할 때 Component의 간격을 gap이라고 하는데 Component들 사이의 수평, 수직간 간격을 설정할 수 있다.

 

--------------------------------
--------------------------------

//붙여준 컨퍼넌트 순서대로 일렬로 쭉 늘어놓는것이 플로우 레이아웃이다.
//우리가 많이쓰는 패널에 쓰는(적용되는?) 레이아웃이다.

[FlowLayoutEx.java]
import java.awt.*;
public class FlowLayoutEx{
public static void main(String[] args){
Frame f=new Frame("FlowLayout 테스트");
Panel p=new Panel();
Button b1=new Button("버튼1");
Button b2=new Button("버튼2");
Button b3=new Button("버튼3");
Button b4=new Button("버튼4");
Button b5=new Button("버튼5");
p.add(b1);
p.add(b2);
p.add(b3);
p.add(b4);
p.add(b5);
f.add(p);
f.setLocation(300,300);
f.setSize(200,100);
f.setVisible(true);
}
}

--------------------------------
--------------------------------

BorderLayout   :보더 레이아웃 , 상하 좌우 센터 배치가 가능하다.  아무영역도 지정하지 않으면 센터에 붙는다. 아래의 내용을 읽어본다고 이해하하긴 어렵다.
 Container의 scope을 5개의 scope으로 분할하여 Component를 배치하는 관리자이다. 
 기본적으로 Component를 BorderLayout에 붙일 때 아무런 scope을 지정하지 않은경우는 기본적으로 CENTERscope에 붙이게 된다.
 CENTERscope은 다른scope에 아무것도 존재하지않으면 그 scope까지 포함해서 scope이 잡히게 된다.
 SOUTH, NORTHscope은 Component의 높이는 제대로 나타나지만 폭의 길이는 인정되지 않는다.
 WEST, EASTscope은 Component의 폭의 길이는 제대로 나타나지만 높이는 제대로 인정되지 않고 항상 그 scope의 길이만큼 잡히게 된다.

--------------------------------
--------------------------------
//창을 늘렸을 경우 높이는 제대로 나타나지만 폭의 길이는 일정하다.

[BorderLayoutEx.java]

import java.awt.*;
public class BorderLayoutEx{
public static void main(String[] args){

Frame f=new Frame("BorderLayout 테스트");
Button east=new Button("EAST");
Button west=new Button("WEST");
Button center=new Button("CENTER");
Button south=new Button("SOUTH"); // 여기가 사우스
Button north=new Button("NORTH");

f.add(east, BorderLayout.EAST); // 이스트를 왼쪽에
f.add(west, BorderLayout.WEST); // 웨스트
f.add(center, BorderLayout.CENTER); //센터에 붙여라.
f.add("South", south); //사우스라는 버튼을 위의 사우스 위치 붙여라.
f.add("North", north);
f.setLocation(300,300);
f.setSize(200,200);
f.setVisible(true);
}
}

--------------------------------
--------------------------------

GridLayout   : 그레이드 레이아웃은 격자모양으로 가로세로가 같은 툴모양으로 만들어서 컴포넌트에 배치


격자모양(모눈종이와 같은 모양)과 같이 가로와 세로가 같은 크기의 비율로 나누어 각 공간(cell)에 Component을 배치할 수 있는 관리자이다.
GridLayout 배치 관리자를 만들 때 행과 열의 수를 지정하는데, 값은 0이상의 값으로 지정하며 만약 0으로 지정하게 되면 무한대로 Component를 추가하여 붙일 수 있다.
행과 열의 수하고 붙이는 Component의 수가 더 많은 경우는 행의 수를 우선으로 맞춘다.

--------------------------------
--------------------------------

[GridLayoutEx.java]
import java.awt.*;
public class GridLayoutEx{
public static void main(String[] args){
Frame f=new Frame("GridLayout 테스트");

f.setLayout(new GridLayout(2,3));//줄은 2개 칸은 3개 줄이 기준. 더 버튼을 아래처럼 붙이면 칸수는 늘어난다. 고로 2,0 을 주어도된다. 만약 0,2 이렇게되면 0 줄이 기준이 될수없다. 이때는 당연히 2가 칸이 기준이된다.

Button b1=new Button("1,1"); // 줄은 2개 칸은 3개인데 버튼은 더 많다. 이해 내용은 위와 같다.
Button b2=new Button("1,2");
Button b3=new Button("1,3");
Button b4=new Button("1,4");
Button b5=new Button("2,1");
Button b6=new Button("2,2");
Button b7=new Button("2,3");
Button b8=new Button("2,4");

f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.add(b7);
f.add(b8);

f.setLocation(300,300);
f.setSize(200,200);
f.setVisible(true);
}
}

 

--------------------------------
--------------------------------

GridBagLayout : 그레이드 뻭 레이아웃은 셀을 합쳐서 셀의 크기를 조정하면서 쓰는 레이아웃을 그레이드 빽 레이아웃이라한다. 괜히 어려운 소스중에 하나다. 그레이 레이아웃은


[GridBagLayoutEx.java]
import java.awt.*;

public class GridBagLayoutEx extends Frame{

GridBagLayout gb;
GridBagConstraints gbc; // 요 두개가필요

public GridBagLayoutEx(){
super("GridGabLayout 테스트");
gb=new GridBagLayout();
setLayout(gb);

gbc=new GridBagConstraints();

gbc.fill=GridBagConstraints.BOTH; // 변수들은 원하는 대로 설정가능. 여긴 보스 라는 상수를 넣어줌

addToFrame(new Button("컴포넌트1"), 0,0,2,1, 2.0, 1.0); //addToFrame이건 임의로 만든 메소드 처음좌표는 0,0  2,1은 비율 가로세로 2:1  
addToFrame(new Button("컴포넌트2"), 2,0,1,1, 0.5, 1.0); // 만약 이예제를 따질라면 이 부분을 보면서 따지면 보다 쉬울것이다. 비율은 0.5 1.0 앞에 비율에 맞춰서 지정.
addToFrame(new Button("컴포넌트3"), 0,1,3,1, 3.0, 1.0);
addToFrame(new Button("컴포넌트4"), 0,2,1,2, 0.0, 1.0);
addToFrame(new Button("컴포넌트5"), 1,2,2,1, 0.0, 1.0);
addToFrame(new Button("컴포넌트6"), 1,3,2,1, 0.0, 1.0);

setBounds(200,200,200,200);
setVisible(true);
}
public void addToFrame(Component com, int x, int y, int width, int height, double wei// addToFrame 메소드 위의 사용하기 위해

gbc.gridx=x; // 그레이드 백 지원해주는걸 각각설정
gbc.gridy=y;
gbc.gridwidth=width;
gbc.gridheight=height;
gbc.weightx=weightx;
gbc.weighty=weighty;
add(com, gbc);
}
public static void main(String[] args){
new GridBagLayoutEx();
}
}

 

 

--------------------------------
--------------------------------

 

CardLayout : 맨위의것만 보여주고 나머지는 안보여주는 카드 레이아웃
 여러 개의 카드를 쌓아둔 것 처럼 Component를 하나만 보여주는 Layout Manager이다.
 맨 위의 Component만 보여주므로 한번에 하나의 Component만 볼 수 있다.
 CardLayout에는 맨 위에 위치할 Component를 지정할 수 있는 method가 지원되며, 또한 그 다음에 나올 Component를 이동시킬 수 있는 method를 지원한다.

 


//이 예제는 3초마다 버튼이? 바뀌는 예제를 확인할수 있다.
[CardLayoutEx.java]

import java.awt.*;

public class CardLayoutEx extends Frame{//프레임을 구성한
CardLayout card; // 카드레이아웃을 선언

Panel first_panel,second_panel,third_panel;
public CardLayoutEx(){
super("CardLayout 테스트");

card = new CardLayout();

setLayout(card);

first_panel = new Panel(); // 첫번째 패널을 만들어서
first_panel.add(new Button("1")); // 그 패널에 들어가는 번호들을 추가
first_panel.add(new Button("2"));

second_panel = new Panel(); // 두번째 패널에다가도 만들어서
second_panel.add(new Button("3")); // 거위의 패널에다가 번호추가 아래도 동일
second_panel.add(new Button("4"));

third_panel = new Panel();
third_panel.add(new Button("5"));
third_panel.add(new Button("6"));

add("1", first_panel); //앞의 1,2,3 카드 레이아웃에 추가시켜주는 순서 퍼스트
add("2", second_panel);// 세컨
add("3", third_panel);
}

public void rotate(){
for(int i=0;i<2;i++){ //0에서 몇번까지 두번반복한다.
try{
Thread.sleep(3000); //3초동안 잠깐 멈췄다가 동ㅈ작하십시오.  sleep
}catch(Exception e){
e.printStackTrace();
}
card.next(this);
}
}
public static void main(String[] args){
CardLayoutEx clt = new CardLayoutEx(); //메소드 생성
clt.setBounds(200,200,200,100); // 메소드 호출
clt.setVisible(true);
clt.rotate();
}
}


--------------------------------
--------------------------------
//플로우 레이아웃

 

import java.awt.*;
public class FlowLayoutEx{
 public static void main(String[] args){
  Frame f=new Frame("FlowLayout 테스트");

  Panel p=new Panel();
  Button b1=new Button("버튼1"); // 패널에다가 버튼을 다섯개 만듬
  Button b2=new Button("버튼2");
  Button b3=new Button("버튼3");
  Button b4=new Button("버튼4");
  Button b5=new Button("버튼5");

  p.add(b1);
  p.add(b2);
  p.add(b3);
  p.add(b4);
  p.add(b5);
  
  f.add(p);
  
  f.setLocation(300,300);
  f.setSize(200,100);
  f.setVisible(true);
 }
}


--------------------------------
--------------------------------
//그레이 레이아웃 하나하나 컴포넌트 해놓은 예제

import java.awt.*;
class  GridBagLayoutEx extends Frame

 GridBagLayout grid = new GridBagLayout();
 GridBagConstraints con = new GridBagConstraints();
 public GridBagLayoutEx(String str){
  super(str);
  setLayout(grid);
  con.fill = GridBagConstraints.BOTH;
  con.weightx = 1.0;
  Button bt1 = new Button("버튼");
  grid.setConstraints(bt1, con);
  add(bt1);
  
  TextField txt = new TextField("GridBagLayout...",15);
  txt.setBackground(Color.black);
  txt.setForeground(Color.green);
  grid.setConstraints(txt,con);
  add(txt);// 하나하나 만들고 붙여주고

  con.gridwidth = GridBagConstraints.REMAINDER;
  Button bt2 = new Button("버튼2")a;
  grid.setConstraints(bt2,con);
  add(bt2);
  con.gridwidth = 1;
  con.gridheight=  2;
  Button bt3 = new Button("버튼3");
  grid.setConstraints(bt3, con);
  add(bt3);// 하나하나 만들고 붙여주고

  con.gridwidth = GridBagConstraints.REMAINDER;
  con.gridheight = 1;
  con.weighty = 0.0;
  Button bt4 = new Button("버튼4");
  grid.setConstraints(bt4,con);
  add(bt4);// 하나하나 만들고 붙여주고
  
  Button bt5 = new Button("버튼5");
  grid.setConstraints(bt5,con);
  add(bt5);
  pack();
  setVisible(true);
 }
 public static void main(String[] args)
 {
  new GridBagLayoutEx("GridBagLayout예제1");
 }
}

 

 

--------------------------------
--------------------------------

 

import java.awt.*;
import java.awt.event.*;
class CardLayoutTest {
 public static void main(String args[]) {
  final Frame f = new Frame("CardLayoutTest");
  final CardLayout card = new CardLayout(10, 10); //10, 10 수평 여백과 수직 여백을 줘라
  f.setLayout(card); // 프레임에 레이아웃을 설정

  Panel card1= new Panel();
  card1.setBackground(Color.lightGray); // 패널 백그라운드는 라이트 그레이
  card1.add(new Label("Card 1")); //카드 ㅇ1

  Panel card2= new Panel();
  card2.add(new Label("Card 2"));
  card2.setBackground(Color.orange);//카드 2색상은 오렌지

  Panel card3= new Panel();
  card3.add(new Label("Card 3"));
  card3.setBackground(Color.cyan);

  f.add(card1, "1");  // Frame에 card1을 "1"이라고 이름 붙여 추가한다.
  f.add(card2, "2");
  f.add(card3, "3");

  class Handler extends MouseAdapter {//마우스 어댑터를 상속
   public void mouseClicked(MouseEvent e) {
    // 마우스 오른쪽 버튼을 눌렀을때
    if(e.getModifiers() == e.BUTTON3_MASK) {
     card.previous(f);  //  CardLayout의 이전 Panel을 보여준다.
    } else {
     card.next(f);   //  아니면 넥스트 해서 CardLayout의 다음 Panel을 보여준다.
    }}} // class Handler
  card1.addMouseListener(new Handler());
  card2.addMouseListener(new Handler());
  card3.addMouseListener(new Handler());
  f.setSize(200, 200);
  f.setLocation(200, 200);
  f.setVisible(true);
  card.show(f,"2"); // Frame에 추가된 Component중 이름이 "1"인 것을 보여준다.
 }}
 


--------------------------------
--------------------------------

//자세한 설명은 안해준 카드 레이아웃 예제

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

class CardLayoutEventTest extends Frame {
 Button first, prev, next, last;
 Panel buttons;
 Panel slide;
 Panel card1, card2, card3, card4, card5; //  slide에 포함될 Panel들
 CardLayout card;

 CardLayoutEventTest(String title) {
  // 화면을 담을 Panel을 담는다.
  slide = new Panel();
  card = new CardLayout();
  slide.setLayout(card);

  // 버튼을 담을 Panel을 만든다.
  buttons = new Panel();
  buttons.setLayout(new FlowLayout());

  first = new Button("<<");
  prev = new Button("<");
  next = new Button(">");
  last = new Button(">>");
  buttons.add(first);
  buttons.add(prev);
  buttons.add(next);
  buttons.add(last);

        // 버튼에 이벤트 리스너를 추가한다.
  first.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
                // CardLayout의 첫번째 slide(Panel)이 보여지도록 한다.
    card.first(slide);   
   }
  });
  prev.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    // 현재 slide의 이전 slide(Panel)이 보여지도록 한다.
    card.previous(slide);   
   }
  });
  next.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    // 현재 slide의 다음 slide(Panel)이 보여지도록 한다.
    card.next(slide); 
   }
  });
  last.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    // CardLayout의 마지막 slide(Panel)이 보여지도록 한다.
    card.last(slide);
   }
  });

  card1= new Panel();
  card1.setBackground(Color.gray);
  card1.add(new Label("첫번째 페이지입니다."));
  card2= new Panel();
  card2.add(new Label("두번째 페이지입니다."));
  card2.setBackground(Color.orange);
  card3= new Panel();
  card3.add(new Label("세번째 페이지입니다."));
  card3.setBackground(Color.blue);
  card4= new Panel();
  card4.add(new Label("네번째 페이지입니다."));
  card4.setBackground(Color.cyan);
  card5= new Panel();
  card5.add(new Label("다섯번째 페이지입니다."));
  card5.setBackground(Color.pink);

        // slide(Panel)에 card1(Panel)을 "1"이란 이름으로 추가한다.
  slide.add(card1, "1"); 
  slide.add(card2, "2");
  slide.add(card3, "3");
  slide.add(card4, "4");
  slide.add(card5, "5");

  add("South", buttons);
  add("Center", slide);

  setSize(200, 200);
  setLocation(200, 200);
  setVisible(true);

  card.show(slide,"1"); // 첫번째 슬라이드(card1)가 나타나게 한다.
 }

 public static void main(String args[]) {
  CardLayoutEventTest mainWin = new CardLayoutEventTest("CardLayoutTest");
 }
}

 


 

댓글