Sponsored By
















728x90

 

레이아웃 중 보더레이아웃(BorderLayout) 사용 방법에 대해 알아보겠음. 

 

 

 

 

 

 

ㅁ. Layout 은 다음과 같이 나뉘고 각 특성을 같으므로 적절하게 사용하면 된다. 

FlowLayout 은 가운데를 중심으로 배치.

BorderLayout 은 가운데를 중심으로 동서남북으로 배치.

GridLayout (행, 열); - 0을 기입하면 auto.!!! 

  ; (예, gridLayout(0,2) 로 만들면 2열이 넘어가는 데이터가 3열로 오면 자동으로 다음행1열로 간다. )

BoxLayout ; 한칸(행)에 하나씩 차지하도록 하는 배치.

 

 

ㅁ. 판넬로 주로 쓰이기 때문에 판넬을 만들고 default레이아웃을 생각하지말고 Layout을 만들어준다고 생각하면됨. 

 

 

 

 

 

 

 

 

 

00. 보더레이아웃(borderlayout)은 다음과 같이 구동시켰을 때, 중심으로 잡혀서 동서남북으로 나뉘어진다.







01. 센터와 동서남북으로 각 버튼을 배치시켜 보았다.

 

 

 

 

 

 

※. 코드

 

 

import java.awt.BorderLayout;

 

import javax.swing.JButton;

import javax.swing.JFrame;

 

class MyFrame extends JFrame{

public MyFrame()

{

this.setSize(500,300);

this.setTitle("GUI Test");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

//BorderLayout 으로 setting 하기

 

//BorderLayout layout = new BorderLayout();

//this.setLayout(layout);

 

this.setLayout( new BorderLayout() );

 

 

 

JButton button1 = new JButton("Button1");

JButton button2 = new JButton("Button2");

JButton button3 = new JButton("Button3");

JButton button4 = new JButton("Button4");

JButton button5 = new JButton("Button5");

 

this.add(button3, BorderLayout.CENTER);

this.add(button1, BorderLayout.NORTH);

this.add(button2, BorderLayout.WEST);

this.add(button4, BorderLayout.EAST);

this.add(button5, BorderLayout.SOUTH);

 

//this.pack();  // Frame 을 가장 tight하게 만듬.  

 

this.setVisible(true);

 

 

}

}// MyFrame Class

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame();

 

 

}// main

 

}// Main Class

 

 

 

728x90
728x90

레이아웃 중 플로우레이아웃(FlowLayout) 사용 방법에 대해 알아보겠음. 

 

 

 

 

 

 

ㅁ. Layout 은 다음과 같이 나뉘고 각 특성을 같으므로 적절하게 사용하면 된다. 

FlowLayout 은 가운데를 중심으로 배치.

BorderLayout 은 가운데를 중심으로 동서남북으로 배치.

GridLayout (행, 열); - 0을 기입하면 auto.!!! 

  ; ( 예, gridLayout(0,2) 로 만들면 2열이 넘어가는 데이터가 3열로 오면 자동으로 다음행1열로 간다. )

BoxLayout ; 한칸(행)에 하나씩 차지하도록 하는 배치.

 

 

ㅁ. 판넬로 주로 쓰이기 때문에 판넬을 만들고 default레이아웃을 생각하지말고 Layout을 만들어준다고 생각하면됨. 

 

 

 

 

 

 

 

 

 

00. 플로우레이아웃(Flowlayout)은 다음과 같이 구동시켰을 때, 프레임이 작으면 아래로 흘러 넘치는 모양이 됨.

 

 

 

 

 

 

※. 코드

 

 

import java.awt.FlowLayout;

 

import javax.swing.JButton;

import javax.swing.JFrame;

 

class MyFrame extends JFrame{

 

public MyFrame()

{

this("No Title");

}

 

public MyFrame(String title)

{

this.setSize(300,300);

this.setTitle(title);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

// Programming here

 

// Layout Set - FlowLayout 쓰겠다.

FlowLayout layout = new FlowLayout();

this.setLayout(layout);  // = MyFrame(=this) 에다 FlowLayout 을 setting 하겠다. 

 

 

JButton button1 = new JButton("Test button1");

JButton button2 = new JButton("Test button2");

JButton button3 = new JButton("Test button3");

 

this.add(button1);

this.add(button2);

this.add(button3);

 

//this.pack();  // 버튼들 크기에 딱 맞게 pack을 한다.

 

this.setVisible(true);

 

}

}// MyFrame Class

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame("FlowLayout Test");

 

 

}// main

 

}// Main Class

 

 

 

728x90
728x90

 

 

 

 

GUI 에서 버튼만드는 방법임.

 

 

 

 

 

 

ㅁ. 버튼따위를 만들때 자바에서 허용하는 버전 2가지.

1. AWP ; OS에서 제공하는 것을 따름. 따라서 용량을 적게 사용할 수 있지만, 임의로 선택을 못함.

2. SWING ; 자바에서 제공하는 것을 따름. 앞에 J를 붙여 사용함. 예, JButton btn1 = new JButton();

SWING을 주로 사용할 것임.

 

 

 

 

 

 

 

00. JButton 객체를 만들어서 container 에 component(여기서는 btn1) 를 add 시켜준다.

 

 

 

 

 

※. 코드

 

 

import javax.swing.JButton;

import javax.swing.JFrame;

 

class MyFrame extends JFrame{

public MyFrame()

{

this.setSize(500,300);

this.setTitle("GUI Test");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

JButton btn1 = new JButton("button1");  // 버튼 이름을 'button1'로 만들고 

this.add(btn1);

 

 

this.setVisible(true);

 

 

}

}// MyFrame Class

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame();

 

 

}// main

 

}// Main Class

 

 

 

 

 

728x90
728x90

 

 

GUI 프로그램 사용하기.

 

 

 

 

 

 

 

ㅁ. GUI를 시작하는 필수코드이므로 'MyFrame' 클래스를 만들고 앞으로 복사해서 사용하면 됨.

 

 

ㅁ. GUI를 만드는 방법은 크게 두 가지.

1. 직접 Frame을 만드는 방법

2. 클래스를 확장하는 방법(클래스로 만드는 방법)

 

따라서, 클래스를 확장하는 방법을 주로 사용하게 된다. (그렇기 때문에 복사해서 사용하면 됨.)

 

 

 

 

 

 

 

 

00_1. '방법1'인 직접 'Frame' 을 만들어보자.







00_2. 결과창을 확인할 수 있다.







01_1. '방법2'인 클래스를 확장시켜보자. 'MyFrame' 이라는 클래스를 만들고 'JFrame'을 상속받는다.







01_2. 평소처럼 'MyFrame' 객체를 만들어서 사용하면된다.







03. 결과값을 확인할 수 있다.

 

 

 

 

 

 

※. 이부분이 GUI시 필요한 부분이므로 GUI를 만들때에는 이부분을 복/붙 하는것이 편하므로 참고바람.

 

import javax.swing.JFrame;

 

class MyFrame extends JFrame {

public MyFrame()

{

 

this("No Title");

 

}

 

 

public MyFrame(String title)

{

this.setSize(500, 400);  //픽셀단위

this.setTitle(title);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

//programming here

 

this.setVisible(true);

 

}

 

}// MyFrame Class

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame();

 

}// main

 

}// Main CLass

 

728x90
728x90

Thread 기능을 이용한 Stack 을 만들어 보는 방법임.

 

 

 

 

 

 

ㅁ. 먼저, 한번 보고가자.

쓰레드를 이용해서 스택을 만들고, 이를 세개의 쓰레드로 각각

 

- Producer : push()만 수행하는 쓰레드

- Consumer : pop()만 수행하는 쓰레드

- Monitor : dump()만 수행하는 쓰레드를 동작시킨다.

- Push와 Pop는 랜덤한 시간 간격으로 동작하고

- dump는 1초의 일정한 시간 간격으로 동작한다.

 

이 때, 세개의 쓰레드가 동일한 스택을 공유해야하기 때문에 스택을 파라미터로 준다.

 

동일한 자원(Resource)를 서로 access하면서 생기는 Racing condition 문제를 해결하기 위해 

synchronized라는 키워드를 사용하면 된다. 

 

 

 

 

 

00. 'Stack'으로 클래스를 하나 만들어서 생성자와 관련동작들을 넣어보자.







01. 메인클래스에 객체를 생성하고 Thread로 던지고 시작시켜보자.








02. 결과값을 확인할 수 있다.

 

 

 

 

 

※. 코드

 

 

class Stack {

private int[] stack;

private int top;

 

// Constructor

public Stack(int size)

{

if(size < 1)

{

size = 10;

}

 

this.stack = new int[size];

this.top = -1;

}

 

synchronized public void push()

{

if( isFull() )

{

System.out.println("[Error] Stack is Full");

return;

}

 

this.stack[++top] = (int)(Math.random() * 1000);

}

 

public boolean isFull()

{

if( this.top == this.stack.length -1)

{

return true;

}

 

return false;

}

 

synchronized public void pop()

{

if( isEmpty() )

{

System.out.println("[Error] Stack is Empty");

return;

}

 

top --;

}

 

public boolean isEmpty()

{

if(this.top == -1)

{

return true;

}

 

return false;

}

 

 

synchronized public void dump()

{

System.out.println("========= Stack Dump ========");

 

for(int i=top; i>=0; i--)

{

System.out.println(this.stack[i]);

}

}

}

 

class Producer implements Runnable {

private Stack stack; 

 

// Constructor

public Producer(Stack stack)

{

this.stack = stack;

}

 

@Override

public void run() {

// TODO Auto-generated method stub

// 무한루프 돌면서 push()만 수행할 예정

// 간격은 랜덤

while(true)

{

try {

Thread.sleep( (int)(Math.random() * 1000)   );

} catch (Exception e) {

// TODO: handle exception

}

 

stack.push();

}

}

 

}

 

class Consumer implements Runnable {

private Stack stack; 

 

// Constructor

public Consumer(Stack stack)

{

this.stack = stack;

}

 

 

@Override

public void run() {

// TODO Auto-generated method stub

while(true)

{

try {

Thread.sleep( (int)(Math.random() * 1000)   );

} catch (Exception e) {

// TODO: handle exception

}

 

stack.pop();

}

}

 

}

 

class Monitor implements Runnable {

private Stack stack; 

 

// Constructor

public Monitor(Stack stack)

{

this.stack = stack;

}

 

@Override

public void run() {

// TODO Auto-generated method stub

while(true)

{

try {

Thread.sleep( 1000 );

} catch (Exception e) {

// TODO: handle exception

}

 

stack.dump();

}

}

 

}

 

public class Test {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

Stack stack = new Stack(7);

 

Producer p = new Producer(stack);

Consumer c = new Consumer(stack);

Monitor m = new Monitor(stack);

 

Thread tp = new Thread(p);

Thread tc = new Thread(c);

Thread tm = new Thread(m);

 

tp.start();

tc.start();

tm.start();

 

 

}

 

 

}

 

 

 

728x90


Sponsored By















+ Recent posts