반응형

JOptionPane의 확인창 변형 쯤으로 볼 수 있는 showOptionsDialogs(옵션창, 옵션 버튼창)에 대해 자세히 살펴보겠습니다.

※ 옵션창 띄우기 - JOptionPane 5. showOptionDialog

JOptionPane 클래스 패키지를 import 해야합니다. 자바 소스 코드 최상단에 다음 import 문을 추가합니다.

import javax.swing.JOptionPane;


※ showOptionDialog 메소드 함수 형태

- 리턴값(static int) : 사용자의 확인 버튼 선택값을 되돌려줍니다.
CLOSED_OPTION - 종료(X) 버튼으로 창을 닫은 경우. CANCEL / NO와 비슷하게 처리해줘야합니다.
YES_OPTION - 예(YES) 버튼 선택시 리턴값
NO_OPTION - 아니오(NO) 버튼 선택시
CANCEL_OPTION - 취소(CANCEL) 버튼 선택시
OK_OPTION - 확인(OK) 버튼 선택시

- 메소드 함수 형태
showOptionDialog( Component parentComponent, Object message,
String title, int optionType, int messageType, Icon icon,
Object[] options, Object initialValue)


※ 매개변수(파라메터, Parameter) 설명

- Component parentComponent
메시지창 다이얼로그가 어떤 Frame에서 나타나게 될 것인지를 정해주는 변수. null 값이거나 설정해준 값에 Frame이 없다면 기본값 Frame(default Frame)이 지정됩니다. 쉽게 null 로 둬도 될 것 같네요.

- Object message
출력할 Object 클래스형 개체. 주로 문자열 메시지를 출력할 것이므로, 간단하게 그냥 출력할 문자열 자체를 써주면 됩니다. 문자열을 여러줄에 걸쳐서 표현하고 싶다면 newline에 해당하는 escape 문자열(" \n ")을 써주면됩니다.

- String title
메시지창 상단 제목표시줄에 나타낼 알림창 제목입니다.

- int optionType
사용자의 대답 선택 버튼을 어떻게 표현할 것인가 결정합니다. "예", "아니오", "취소" 버튼을 어떤 식으로 배치할 지 결정합니다.
YES_NO_OPTION
YES_NO_CANCEL_OPTION
OK_CANCEL_OPTION

- int messageType
알림창의 메시지 종류를 정해줍니다. 여기서 정해주는 메시지 종류에 따라 자동으로 지정된 아이콘이 표시됩니다.
ERROR_MESSAGE
INFORMATION_MESSAGE
WARNING_MESSAGE
QUESTION_MESSAGE

아이콘 없음 :
PLAIN_MESSAGE

- Icon icon
Icon 클래스를 통해서 직접 정해줄 수도 있습니다. 아이콘 클래스는 제가 잘 모르겠네요 죄송^^ 웬만하면 위 메시지 종류 선택으로 적당히 커버는 될 겁니다. 직접 사용자 아이콘을 정해주려면 Icon 클래스 관련 내용을 공부하셔야 할 거 같네요. null 로 해두면 기본값이 출력됩니다.

- Object[] options
예, 아니오, 취소(YES,NO,CANCEL) 버튼에, 다른 문자를 넣습니다. 문자열 배열 3개 짜리로 각 문자열을 지정해줄 경우, YES/NO/CANCEL 대신 지정해둔 문자가 버튼으로 출력됩니다. 자세한 사용 예제는 아래를 참고하세요.

- Object initialSelectionValue
여러개의 버튼 중 어느 버튼을 초기값으로 선택해 줄 것인지 결정합니다. 확인창이 처음 뜰 때, 보통 점선으로 표시된 기본 커서가 어느 버튼 중 하나에 올라가 있죠. 그 위치를 정해줍니다.

※ 사용 예제

String[] buttons = {"첫번째값", "두번째값", "세번째값"};
result = JOptionPane.showOptionDialog(null, "options를 이용해서\n버튼을 여러개 만들어봅니다.", "제목표시줄", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, buttons, "두번째값");

실행 결과

실행 결과

<출처:http://hallang.tistory.com/>

반응형

채팅프로그램을 짜는데 자동으로 스크롤이 되지 않는것을 발견

자바스터디에 있는 Q & A 게시판 보고 해결했습니다.


원래 스크롤페인은 자동스크롤이 되게 구현되어 있는데

채팅프로그램과 같이 쓰레드를 사용하는 곳에선

스크롤내의 컴퍼넌트 값은 변화하나 스크롤은 변화되지 않는다고

합니다.


이를 구현하기 위해선


변수로

JScrollPane txtScroll;

JTextArea txtArea; 선언되었다고 치면.


txtArea.append("내용"); //내용이 추가될때마다 아래문장을 호출

txtScroll.getVerticalScrollBar().setValue(txtScroll.getVerticalScrollBar().getMaximum());

반응형

import java.awt.*;
import javax.swing.*;

public class JImagePanel extends JPanel {
Image image;

public JImagePanel(Image image) {
this.image = image;
}

public void paintComponent(Graphics g) {
g.drawImage(this.image, 0, 0, this);
}

public static void main(String[] args) {
JFrame frame = new JFrame();
ImageIcon icon = new ImageIcon("d:\\java.gif");
JImagePanel panel = new JImagePanel(icon.getImage());
frame.getContentPane().add(panel);
frame.setSize(300,300);
frame.setVisible(true);
}
}
<출처:ibm.com/developerworks/kr>

반응형

자바 프로그래머라면 당연히 AWT나 Swing 컴포넌트에 대해서 알고 있고 GUI를 위해서 여러 형태의 컴포넌트들을 조합해서 원하는 화면을 만들어 보았을 것이다. 그러나 때로는 JDK 에서 지원하는 표준 컴포넌트들만으로는 무엇인가 부족함을 느껴 본적은 없는가? 자신의 입맛에 딱 맞는 컴포넌트가 없어서 오랜 시간을 허비하거나 고생해본 경험이 있을 수도 있다. 이번 기사에서는 자신만의 간단한 컴포넌트를 작성해보기로 하자.

이번 소스에서 만들것은 CPU의 사용양을 윈도우의 작업 관리자에서 보이는 형태처럼 만드는 것이다. JProgressBar를 사용하면 비슷한 형태가 나오기는 하지만 아무래도 많이 다르다는 느낌이 들어서 직접 만들어서 사용하자.

import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.*;

public class PmTickChartPanel extends JPanel {
BorderLayout borderLayout1 = new BorderLayout();
JPanel centerPanel = new JPanel();
JPanel southPanel = new JPanel();
JPanel northPanel = new JPanel();
JLabel dataLabel = new JLabel();
GridLayout gridLayout1 = new GridLayout();
BorderLayout borderLayout2 = new BorderLayout();
JLabel titleLabel = new JLabel();
BorderLayout borderLayout3 = new BorderLayout();
JPanel westPanel = new JPanel();
JPanel eastPanel = new JPanel();

// 편의상 눈금은 10개만 보이고 색상 변경도 10 단위로만
int tickCount = 10;

Border centerPanelBorder;
private Border border1;

public PmTickChartPanel() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
centerPanelBorder = BorderFactory.createLineBorder(Color.green, 1);
border1 = BorderFactory.createBevelBorder(BevelBorder.LOWERED, new Color(4, 4, 4), new Color(3, 3, 3), Color.black, Color.black);
this.setBackground(Color.black);
this.setForeground(Color.green);
this.setBorder(border1);
this.setLayout(borderLayout1);
centerPanel.setBackground(Color.black);
centerPanel.setFont(new java.awt.Font("Dialog", 0, 12));
centerPanel.setForeground(Color.green);
centerPanel.setBorder(centerPanelBorder);
centerPanel.setLayout(gridLayout1);
southPanel.setBackground(Color.black);
southPanel.setForeground(Color.green);
southPanel.setLayout(borderLayout2);
northPanel.setBackground(Color.black);
northPanel.setForeground(Color.green);
northPanel.setLayout(borderLayout3);
dataLabel.setBackground(Color.black);
dataLabel.setFont(new java.awt.Font("Dialog", 1, 12));
dataLabel.setForeground(Color.green);
dataLabel.setHorizontalAlignment(SwingConstants.CENTER);
dataLabel.setHorizontalTextPosition(SwingConstants.CENTER);
dataLabel.setText("");
titleLabel.setBackground(Color.black);
titleLabel.setFont(new java.awt.Font("Dialog", 1, 12));
titleLabel.setForeground(Color.green);
titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
titleLabel.setHorizontalTextPosition(SwingConstants.CENTER);
this.titleLabel.setText("CPU");
gridLayout1.setColumns(1);
gridLayout1.setRows(tickCount);
gridLayout1.setHgap(1);
gridLayout1.setVgap(1);
eastPanel.setBackground(Color.black);
eastPanel.setForeground(Color.green);
westPanel.setBackground(Color.black);
westPanel.setForeground(Color.green);
this.add(centerPanel, BorderLayout.CENTER);
this.add(southPanel, BorderLayout.SOUTH);
southPanel.add(dataLabel, BorderLayout.CENTER);
this.add(northPanel, BorderLayout.NORTH);
northPanel.add(titleLabel, BorderLayout.CENTER);
this.add(westPanel, BorderLayout.WEST);
this.add(eastPanel, BorderLayout.EAST);
setPreferredSize(new Dimension(90, 180));

for (int i = 0; i < tickCount; i++) {
Tick tick = new Tick(); // 눈금(tick)을 10개 생성하여 추가
this.centerPanel.add(tick);
}
}

/* 실제 컴포넌트에 값을 설정하면 눈금에 색상을 변경한다
* 값의 범위는 0~100 으로 하자
*/
public void setValue(int value) {
if (value > 100) { // 100을 넘어가면 100으로
value = 100;
}
else if (value < 0) { // 0보다 작으면 0으로
value = 0;
}

// 일단 전체 tick 을 검정색으로 칠하고
for (int j = 0; j < tickCount; j++) {
Tick tick = (Tick)this.centerPanel.getComponent(j);
tick.setBackground(Color.black);
tick.repaint();
}

// 입력된 value 값에 해당하는 tick들만 다시 녹색으로 칠한다
for (int i = 0; i < tickCount; i++) {
Tick tick = (Tick)this.centerPanel.getComponent(i);
if (tickCount - i > value / 10) {
// nothing to do
} else {
tick.setColor(Color.green);
tick.repaint();
}
}

// 하단에 숫자로 값을 표시
this.dataLabel.setText(value + " %");
}

public static void main(String args[]) {
JFrame frame = new JFrame(); // 테스트용 프레임을 생성하자
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
PmTickChartPanel tickPanel = new PmTickChartPanel();
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(tickPanel, BorderLayout.CENTER);

frame.setSize(300, 300);
frame.setVisible(true);

for (int i = 0 ; i < 100 ; i++) { // 테스트를 위해 값을 설정하는 부분
try {
Thread.sleep(100); // 잠시 쉬었다가
tickPanel.setValue(i); // 1씩 증가되는 값을 설정, 10 단위로 눈금 색상 변경
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
}

/* 10 단위의 눈금 하나에 해당하는 컴포넌트
* 같은 값을 갖는 것이 좌우 하나씩 쌍으로 구성된다
*/
class Tick extends JPanel {
JPanel lPanel = new JPanel();
JPanel rPanel = new JPanel();
GridLayout layout = new GridLayout(1, 2);

public Tick() {
this.setBackground(Color.black);
this.setForeground(Color.black);
lPanel.setBackground(Color.black);
lPanel.setForeground(Color.green);
rPanel.setBackground(Color.black);
rPanel.setForeground(Color.green);
layout.setHgap(1);
setLayout(layout);
add(lPanel);
add(rPanel);
}

protected void setColor(Color color) {
lPanel.setBackground(color);
rPanel.setBackground(color);
}
}
<출처:ibm.com/developerworks/kr>

반응형

 컨테이너와 배치

u    컨테이너의 이해

Ø      컨테이너는 자신의 영역 안에 다른 컴포넌트를 포함할 있는 컴포넌트를 의미한다.

Ø      컨테이너는 자신만으로는 특별한 동작을 없고, 다른 컴포넌트를 포함할 때만 의미가 있다. 컨테이너 자체도 컴포넌트로 취급되며 다른 컨테이너에 부탁될 있다.

Ø      Panel : 다른 컨테이너에 부착되어 일부 영역을 컨트롤 하는데 많이 사용된다.

Ø      Dialog : 대화창에서 주로 사용되는 컨테이너이다.

Ø      Applet Frame 대표적인 최상위 컨테이너로써 다른 컨테이너를 포함한 바깥쪽 컨테이너를 의미한다.

 

u    컨테이너의 사용

컨테이너

설명

Window

컨테이너

최상위 윈도우를 제공하는 컨테이너, Frame Dialog 컨테이너가 주로 대신 사용됨

메소드 이름

기능

void pack()

배치 관리자를 실행시켜서 포함된 컴포넌트의 배치를 시작하고, 윈도우의 크기를 조절함

void show()

윈도우를 화면에 나타나게 하며 윈도우 중에 가장 맨 상단에 나타나게 한다.

void dispose()

다 사용한 윈도우 리소스를 해제시킨다.

Frame

컨테이너

다른 컨테이너와 마찬가지로 add() 메소드를 사용. 배치 요구.

Frame 클래스 생성 후 setSize() 또는 setBounds() 메소드를 이용해서 크기를 꼭 정해줘야 하며 하부 컴포넌트 배치를 위해 pack() 메소드를 호출하고 마지막으로 setVisible(true) 메소드를 통해 화면에 표시해야 한다.

코드 및 예는 표 하부를 참조할 것

Panel

컨테이너

Applet Frame 클래스가 가장 바깥쪽의 컨테이너 역할을 하는데 반해, Panel 클래스는 컴포넌트들을 그룹별로 모을 때 주로 사용한다. 보통 GUI를 설계할 때 컴포넌트를 독립적으로 Applet Frame에 바로 붙이기 보다는 Panel 클래스에 그룹별로 붙이고 패널 클래스들을 배치하는 경우가 대부분이다.

코드 및 예는 표 하부를 참조할 것

Applet

컨테이너

Applet 클래스는 16장에서 살펴본다.

setSize(), setBounds() 메소드를 해 주어도 원하는 크기대로 웹 브라우저에서 나타나지 않는 경우가 있다. 왜냐면 브라우저의 종류에 따라서 조금씩 차이가 있기 때문에 직접적인 메소드보다는 HTML 태그의 사이즈 부분에 값을 주는 것이 바람직하다.

Dialog

컨테이너

팝업 윈도우의 형태로 메인 윈도우 외에 따로 메시지를 출력하거나, 사용자의 입력을 받을 때 주로 사용되는 컨테이너다.

생성자를 알아보자

형태

기능

Dialog(Frame owner)

Dialog(Dialog owner)

기본 생성자.

Dialog(Dialog owner, String title)

Dialog(Frame owner, String title)

Dialog에 타이틀에 추가

Dialog(Dialog owner, String title, boolean modal)

Dialog(Frame owner, String title, boolean modal)

해당 Dialog를 모달(Modal)로 할 것인지의 여부를 지정함, 모달이란 Dialog가 활성화되어 있을 때는 다른 윈도우를 선택할 수 없는 기능임

Dialog(Frame owner, boolean modal)

상위 컨테이너가 Frame인 경우의 생성자

생성과정

Dialog 클래스 상속 : 상속을 통해서 개발자가 새로운 대화창을 만든다.

super() 를 이용하여 생성자 호출

setVisible() 메소드 호출

코드 및 사용 예는 표 하부를 참조할 것

Ø      Frame 컨테이너 사용

import java.awt.*;

 

public class FrameTest {

       public static void main(String args[]){

             Frame f = new Frame("테스트 프레임");  // 프레임 생성

             Label l = new Label("5 후에 없어지는 프레임");

            

             f.add(l);

             f.setBounds(10, 10, 300, 200); //크기 위치 셋팅

             f.setVisible(true);              // 화면에 나타낸다.

            

             try{

                    Thread.sleep(5*1000);

             }catch(InterruptedException e){}

            

             f.setVisible(false);

            

             f.dispose();               // 자원을 해제한다.

       }

}

<실행결과>

Ø      Panel 컨테이너 사용

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

 

public class PanelTest extends Applet implements ActionListener{

       Panel panel1, panel2;

       Button button1, button2, button3, button4;

      

       public void init(){

             panel1 = new Panel();

             panel2 = new Panel();

            

             panel1.setBackground(Color.red);

             panel2.setBackground(Color.yellow);

            

             add(panel1);

             add(panel2);

            

             button1 = new Button("패널 2 보이기");

             button2 = new Button("패널 2 안보이기");

             button3 = new Button("패널 1 보이기");

             button4 = new Button("패널 1 안보이기");

            

             button1.addActionListener(this);

             button2.addActionListener(this);

             button3.addActionListener(this);

             button4.addActionListener(this);

            

             panel1.add(button1);

             panel1.add(button2);

             panel2.add(button3);

             panel2.add(button4);

       }

      

       // 버튼이 눌리면 actionPerformed() 메소드가 호출된다.

       public void actionPerformed(ActionEvent ae){

             Button b = (Button)ae.getSource();

            

             String label = b.getLabel();

            

             if(label.equals("패널 1 보이기"))

                    panel1.setVisible(true);

             else if(label.equals("패널 1 안보이기"))

                    panel1.setVisible(false);

             else if(label.equals("패널 2 보이기"))

                    panel2.setVisible(true);

             else

                    panel2.setVisible(false);

       }

}

<실행결과>

Ø      Dialog 컨테이너 사용

<Notification.java>

import java.awt.*;

import java.awt.event.*;

 

class Notification extends Dialog implements ActionListener{

      

       String msg;

      

       public Notification(Frame f, String s){

             super(f,"주목",true);

             msg = s;

       }

      

       public void disp(){

             Button b;

            

             add("North", new Label(msg,Label.CENTER));

            

             b = new Button("OK");

             b.addActionListener(this);

            

             Panel p = new Panel();

             p.add(b);

             add("South", p);

             setBackground(Color.gray);

             setSize(160,100);

             setVisible(true);

       }

      

       public void actionPerformed(ActionEvent e){

             dispose();

       }

}

 

<TestDialog.java>

import java.awt.*;

import java.awt.event.*;

 

class TestDialog extends Frame implements ActionListener{

             Notification n;

            

             public TestDialog(){

                           super("다이얼로그를 테스트합니다.");

                          

                           n = new Notification(this,"다이얼로그가 보입니다");

                          

                           Panel p = new Panel();

                           Button b1 = new Button("다이얼로그 열기");

                           b1.addActionListener(this);

                          

                           p.add(b1);

                          

                           add(p);

                          

                           setSize(300,150);

                           setVisible(true);

             }

            

             public void actionPerformed(ActionEvent e){

                           n.disp();

             }

            

             public static void main(String args[]){

                           TestDialog t = new TestDialog();

             }

}

<실행결과>

 

u    배치에 대한 이해

Ø      문제 분석 : GUI에서 화면을 구성하기 위해서는 컴포넌트의 위치를 좌표로 지정해 주었다. 다른 운용체제에서 절대 좌표를 입력하면 다르게 표시되어 원하는 모습이 나오지 않는다. 또한 컨테이너의 사이즈를 재조정하면 안에 들어 있는 컴포넌트의 위치가 제각각 변하기 때문에 배치 개념이 나옴

Ø      문제 해결 : 플랫폼 독립성의 특징을 이용해 컴포넌트의 배치를 배치 관리자(Layout Manager)라는 것을 이용하여 처리하도록 한다. 배치 관리자는 LayoutManager 인터페이스를 반드시 구현하도록 되어 있는데 배치 관리자를 통해 컴포넌트를 영역에 배치한다.

Ø      컨테이너가 배치 관리자에게 컴포넌트를 배치하는 것을 요청하면 컴포넌트 간의 간격이나 컴포넌트의 크기 등의 윈도우 시스템에 종속적인 값을 배치 관리자가 하위 윈도우 시스템에 가장 적합한 값으로 매핑해서 화면에 보여준다.

Ø      디폴트 배치 관리자

컨테이너

배치 관리자

Applet, Panel

FlowLayout

Window, Frame, Dialog

BorderLayout

Ø      자바의 컨테이너가 배치 관리자를 사용하기 위한 절차

① 필요한 배치를 지원하는 배치 관리자 클래스 객체를 생성

② 배치 관리자 클래스를 컴포넌트의 setLayout() 메소드를 이용하여 컨테이너에 설정

③ 이후 add() 메소드로 추가되는 컴포넌트는 설정된 배치 관리자 클래스에

 

u    Flow 레이아웃

Ø      컨테이너에 주어진 컴포넌트를 왼쪽에서 오른쪽으로, 위에서 아래쪽으로 순차적으로 배열한다.

Ø      배치시 주의점은 컴포넌트가 지정한 크기를 무시하고 컴포넌트에 필요한 최소한의 높이와 위치, 간격이 자동적으로 지정되어 배치된다.

Ø      코드는 생략하고 실행결과와 특징변화의 예시를 보자.

<실행결과>

      (기본모습)                 (옆으로 윈도우를 늘렸을 )

 

u    Border 레이아웃

Ø      배치에는 North, East, South, West, Center 이름이 붙어 있다.

Ø      이름은 컴포넌트를 컨테이너에 포함시킬 , 같이 주어지며 이에 의해서 컴포넌트가 포함되는 위치가 정해진다.

Ø      소스 코드 실행 결과

import java.awt.*;

 

public class BorderTest extends Frame{

      

       public static void main(String args[]){

             BorderTest f = new BorderTest();

            

             f.setLayout(new BorderLayout());

            

             f.add("North", new Button("첫번째"));

             f.add("East", new Button("두번째"));

             f.add("West", new Button("세번째"));

             f.add("South", new Button("네번째"));

             f.add("Center", new Button("다섯번째"));

            

             f.setSize(300,300);

             f.setVisible(true);

       }

}

<실행결과>

 

u    Grid 레이아웃

Ø      그리드 레이아웃은 생성할 컬럼수와 라인수를 지정한다.

Ø      레이아웃에서는 배치되는 컴포넌트의 크기와 상관없이 셀의 크기와 고정적이기 때문에 컴포넌트의 사이즈가 완전히 무시된다. 컴포넌트를 추가하면 좌측에서 우측으로, 상단에서 하단의 순서대로 컴포넌트가 추가된다.

Ø      소스 코드 실행 결과

import java.awt.*;

 

public class GridTest extends Frame{

      

       public static void main(String args[]){

             GridTest f = new GridTest();

             

             f.setLayout(new GridLayout(3,2));

            

             f.add("North", new Button("첫번째"));

             f.add("East", new Button("두번째"));

             f.add("West", new Button("세번째"));

             f.add("South", new Button("네번째"));

             f.add("Center", new Button("다섯번째"));

            

             f.setSize(300,300);

             f.setVisible(true);

       }

}

<실행결과>

 

u    Card 레이아웃

Ø      카드를 포개어 놓은 듯한 레이아웃 형태로서 포개 놓으면 위의 카드밖에는 없듯이 배치 관리자를 쓰면 한번에 하나의 컴포넌트밖에는 없다.

Ø      소스 코드 실행결과

import java.awt.*;

import java.awt.event.*;

 

public class CardTest extends Frame implements ActionListener{

            

             CardLayout cl;

            

             public static void main(String args[]){

                           CardTest f = new CardTest();

                           Button b;

                          

                           f.cl = new CardLayout();

                           f.setLayout(f.cl);

                          

                           b = new Button("첫번째");

                           b.addActionListener(f);

                           f.add("1,", b);

                          

                           b = new Button("두번째");

                           b.addActionListener(f);

                           f.add("2,", b);

                          

                           b = new Button("세번째");

                           b.addActionListener(f);

                           f.add("3,", b);

                          

                           b = new Button("네번째");

                           b.addActionListener(f);

                           f.add("4,", b);

                          

                           b = new Button("다섯번째");

                           b.addActionListener(f);

                           f.add("5,", b);

                          

                           f.setSize(300,300);

                           f.setVisible(true);

             }

            

             public void actionPerformed(ActionEvent e){

                           cl.next(this);

             }

}

<실행결과>

 ( 화면)                             ( 화면 클릭 두번째 화면)



 

u    GridBag 레이아웃

Ø      지정된 사이즈를 좌표를 이용해 영역 구분을 해준다.

Ø      소스 코드 실행 결과

import java.awt.*;

import java.util.*;

 

public class GridBagTest extends Panel{

            

             GridBagConstraints c;

            

             public GridBagTest(){

                           GridBagLayout gridbag = new GridBagLayout();

                           setLayout(gridbag);

                           setBackground(Color.red);

                          

                           c = new GridBagConstraints();

                           c.weightx = 1.0;

                           c.weighty = 1.0;

                           c.fill = GridBagConstraints.BOTH;

                          

                           layout(new Button("첫번째"), 0,0,1,2);

                           layout(new Button("두번째"), 2,0,2,1);

                           layout(new Button("세번째"), 1,1,1,1);

                           layout(new Button("네번째"), 2,1,1,1);

             }

            

             public void layout(Component obj, int x, int y, int width, int height){

                           c.gridx = x;

                           c.gridy = y;

                           c.gridwidth = width;

                           c.gridheight = height;

                           add(obj, c);

             }

            

             public static void main(String args[]){

                           Frame test = new Frame();

                           test.setSize(300,300);

                           test.add(new GridBagTest());

                           test.setVisible(true);

             }

}

<실행결과>

출처 : Tong - winshwin님의 + [JAVA/JSP]통

반응형

* Layout Manager


1. FlowLayout : Panel, Applet의 default Layout manager

     - Component를 왼쪽에서 오른쪽으로 배치

     - Default로 component를 Frame의 중앙에 배치

     - Component의 size는 layout maneger가 결정

     - Layout Manager의 Constructor를 이용하면 Manager의 속성을 변경할 수 있다.


     ex) setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40))

          Component를 오른쪽에 배치하며, 20은 Component간의 좌우 Gap을 지정하며, 40은

          Component간의 상하 Gap을 지정하는 것이다. 단위는 pixel.


2. BorderLayout : Window, Frame의 default manager

     - Component를 East, West, North, South, Center 다섯군데에 배치

     - f.add(bn, BorderLayout.NORTH)    f.add(bn, NORTH)   둘 다 버튼을 북쪽에 배치

     - 위치를 지정하지 않으면 Center에 겹쳐 나타나게 된다.


3. GridLayout

     - 격자를 만들어 그 위에 Component를 배치

     - Component를 추가하면 왼쪽에서 오른쪽으로, 위쪽에서 아래쪽으로 배치

     - Constructor를 통해 격자의 크기 결정가능.


4. CardLayout

     - 여러장의 카드(Panel로 구성)를 겹쳐놓고 필요에 따라 그 카드를 보여줌


5. GridBagLayout

     - GridLayout과 비슷하나 더 복잡

반응형
 

GUI - AWT : 이벤트처리

     - SWING : 컴포넌트

◈ AWT ◈

 ▷ 하나의 코드를 가지고 여러 OS에서 동일한 형태로 실행이 되어야 하기 때문에 특정 OS에서만 제공한하는 GUT컴포넌트는 AWT에서 포함시킬수없다.

 ▷ OS에 종속됨

◈ Swing(스윙) ◈

 ▷ 스윙은 AWT의 단점을 보안. 개발된 자바 라이브러리.

 ▷ 스윙의 장점은 코드전체가 자바로 되어있어서 OS에 종속되는 부분이 없다.

    OS에 종속되는 부분이 없어 기존의 컴포넌트를 확장가능.

 ▷ 스윙으로 작성한 코드는 OS에 상관없이 어디서나 동일한 결과가 나온다.

    AWT에 있는기능은 스윙에 있지만 스윙에 있는 기능은 AWT에 없다.


◆ Component ◆

  └ 스윙의 컴포넌트는 대부분 javax.swing.JComponent클래스를 상속방아 사용.

  └  JComponent클래스는 AWT의 java.awt.Container를 확장한 클래스  

       Component      <====     Container    <====     JComponent

       (java.awt)                   (java.awt)                (javax.sing)


◆ JComponent ◆

  └ 툴팁(ToolTip)

     - 모든 컴포넌트에서는 풍선 도움말을 작성 할 수 있다.

        풍선도움말을 컴포넌트 위에 마우스를 올려 놓았을 때 도움말이 나타나게 된다.

     - 툴팁 텍스트를 설정하려면 selToolTipText메소드를 이용.

         public void setToolTipText(String tooltipMessage)

  └ 더블버퍼링 =>깜빡거리는 형상을 줄임.

     - 스윙에서 자체적으로 지원.

  └ 테두리(Border) : 컴포넌트의 테두리를 임의의 형태로 작성.

      - 컴포넌트에 테두리를 변경하고 싶다면

         public void setBorder(Border border)


◆ Container ◆ 

  └ 컨테이너는 다른 컴포넌트를 담기 위해 특화된 컴포넌트로 각 컨테이너마다 컴포넌트를 담는 방식.

  └ 컨테이너는 AWT의 컨테이너를 상속받아 구현된 최상의 컨테이너와 JComponent를 상속받아서 구현된 일반컨테이너와 구분

  └ 최상의 컨네이너 구조(JWindow, JDialog, JApplet, JFrame)이 있는데 각각의 AWT의 Window,Dialog,Frame을 상속받아서 구현한 컨테이너이다.

  └ 최상위 컨테이너는 Swing's GUI Application Program을 할 때 최소한 한개 이상을 가지고 있다.

  └ 최상위 컨테이너는 컴포넌트를 직접적으로 추가하지 않고, 포넌트의 추가/삭제를 JRootPane클래스에 위임하는 구조를 갖는다.
   - layerdPane에는 ContentPane하고 GlassPane이 있고, LayerPane은 RootPane에 붙고 RootPane은 Frame에 붙는다.

   - 컴포넌트를 붙일때는 ContentPane에 붙인다.

 ===================================================================                            

    **최상에는 JFrame이 있다.

==================================================================

awt는 바로 frameㅇ을 content를 붙이지만 swing에서는 JFrame에 JComponent를 추가 할 수 없다.

왜냐하면 컴포넌트의 추가/삭제는 JRootPane에 위임하기 때문이다.

따라서 대부분의 컴포넌트는 ContentPane에 추가/삭제하도록 되어있다.


 ⊙ setSize(400,500);

   └ JFrame에 width와 height를 지정한다. -setSize는 프레임의 크기
 ⊙ pack();
   └ pack() 컴포넌트 크기만큼 JFrame의 사이즈를 구성한다.
 ⊙ setLocation(500,500);

    └ JFrame에 시작 위치(width,height)를 지정.
 ⊙ setBounds(500,500,400,500);

    └ 크기와 위치를 동시에 지정 -setBounds(setSize,setLocation);
 ⊙ setVisible(true);

    └ JFrame을 보여주는지를 지정. true=>보여준다 / false=>보여주지 않는다.
 ⊙ setDefaultCloseOperation =>JFrame 종료 할때 어떤 동작할 것인가를 지정
       <옵션>
           └ DO_NOTHING_ON_CLOSE : 종료를 눌렀을때 아무 동작도 하지 말아라.
           └ HIDE_ON_CLOSE (default) :프로그램 종료 하지 않은 상태에서 숨어있어라.
           └ DIPOSE_ON_CLOSE : 현재프레임만 종료하라.
           └ EXIT_ON_CLOSE  : 모든 프레임을 종료하라.
 ⊙ setResizable(true);
    └ 프레임의 크기를 고정할 것인가 를 지정. true=>사이즈를 변경 가능. false=> 사이즈 변경 불가능.
 ⊙ JFrame.setDefaultLookAndFeelDecorated(true);
    └ JFrame을 JAVA LookAndFeel로 바꿔주는 메소드. 만약 false일경우 자바로 변경이 안됨.
   주의) JFrame 객체가 생성되기 이전에 호출되어야 한다.


   ex> public static void main(String[] args){
          JFrame.setDefaultLookAndFeelDecorated(true);
           new JFrameDemo("프레임 테스트");
         }

======================jframe을 상속받은 경우============================

package swing;
import java.awt.*;
import javax.swing.*;
public class JFrameDemo extends JFrame{
 public JFrameDemo(String title){
  super(title);
  JButton jbtn=new JButton("테스트");
  Container contentPane=getContentPane();
  contentPane.add(jbtn);
  setSize(400,500);
  setLocation(500,500);
  setVisible(true);
  setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  setResizable(true);
 }
 public static void main(String[] args){
  JFrame.setDefaultLookAndFeelDecorated(true);
  new JFrameDemo("프레임 테스트");
 }
}


===========================jframe을 상속 받지 않은 경우========================

package swing;
import java.awt.*;
import javax.swing.*;
public class JFrameEx {
 public JFrameEx(String title){
  //부모가 없어지면 new를 통해 부모를 생성하고
  // 부모가 사용했던 래퍼런스는 부모.래퍼런스로 접근해주면 된다.
  JFrame jframe=new JFrame(title);
  JButton jbtn=new JButton("테스트");
  Container contentPane=jframe.getContentPane();
  contentPane.add(jbtn);
  jframe.setLocation(500,500);
  jframe.setVisible(true);
  jframe.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  jframe.setResizable(true);
 }
 public static void main(String[] args){
  JFrame.setDefaultLookAndFeelDecorated(true);
  new JFrameDemo("프레임 테스트");
 }
}

===================================================================

반응형
import java.awt.*;
import java.io.File;
class FrameTest
{
    public static void main(String args[]){
        Frame f = new Frame();
        f.setTitle("Frame Test");
        f.setSize(200,200);
        f.setResizable(false);
 
        Image icon = f.getToolkit().getImage("Photo0007.jpg");
        f.setIconImage(icon);
        f.setVisible(true);
    }
};
반응형
///////////////////////////////////////////////////////////////

java 프레임 타이틀바 없애기..

import javax.swing.*;
import java.awt.*;
public class NoTitleBarFrameTest {
 public static void main(String[] args) {
  JFrame f = new JFrame();
  f.setUndecorated(true);
  f.setSize(300,300);
  f.setVisible(true);
  //JWindow w = new JWindow();
  //w.setSize(300,300);
  //w.setVisible(true);
 }
}

setUndecorated 메소드를 사용해 보세요. 주의점을 setVisible(true) 전에 해야 한다는 것입니다.


또는 JFrame 대신 JWindow를 사용하시던지요. (밑에 주석 처리한 것입니다.)

반응형

풀스크린 윈도우 (FullScreen Window) 만들기

import
 java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FullScreen1 {
  GraphicsDevice device;

  public FullScreen1() {
    GraphicsEnvironment ge = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
    device = ge.getDefaultScreenDevice();
    GraphicsConfiguration gc = device.getDefaultConfiguration();

    try {
      JFrame frame = new JFrame(gc);
      //프레임의 테두리를 없앤다.
      frame.setUndecorated(true);

      JButton button = new JButton("OK");
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          device.setFullScreenWindow(null);
          System.exit(0);
        }
      });

      frame.getContentPane().add(button);
      //frame을 스크린에 가득차도록 풀스크린 윈도우로 만듬
      device.setFullScreenWindow(frame);
      frame.setVisible(true);
    } catch (Exception ex) {
      device.setFullScreenWindow(null);
      System.exit(0);
    }
  }
  public static void main(String[] args) {
    new FullScreen1();
  }
}

+ Recent posts