2008년 11월 04일
2학기 8주차_2
Awt 의 가장 큰 취약점은 플랫폼이 달라지면 의도한바와는 다르게
된다는 점이다.
이런것들은 Swing으로 극복이 가능하다 ㅎㅎ
○ Swing
스윙은 여러가지 다양한 기능(찾아써넣을것..)
기능을 갖는다.
게다가 AWT를 대체 할수 있는것들이 많기때문에..;;
뭐 AWT의 컴포넌트에서 J를 앞에 붙이면 스윙컴포넌트가 된다고 생각하면 되겠다.
자 여기서 가장 중요한부분..
스윙이 가지는 j프레임은 awt의 프레임과 기본적으로 트리다.
awt프레임은 컴포넌트를 직접 add하고 기본적으로 보더레이아웃을 가지고 있었지만..
스윙의 j프레임은 속지(? 컨텐트페인)를 가지는데 이것은 캠버스의 그래픽스와 같은 개념이다.
j프레임도 사용할때는 컨텐트페인을 사용하여야한다.
사실 j프레임도 보더레이아웃을 기본으로 가진다 ㅎㅎ
뭐 쉽게 말하자면..;;
컨텐트페인은 j프레임의 관리자? 지배인?
그정도가 되겠다.
근데 뭐 사실 자바1.5버전부터는 컨텐트페인을 하지 않아도.. 컴파일에는 문제가 없도록
하게 했다고 한다. 그런데 왜 컨텐트페인을 배웠을까??
왜냐하면.. 원래가 그렇게 하는거고 안하면 편법쯤 된다.. 음.. 예외처리를 남한테 넘기는거처럼 ㅋㅋ
그리고 컨텐트페인을 사용할때와 안할때 모양이 조금씩 틀린것도 있으니 사용하는걸 권장
하는거라고... ㅎㅎㅎ
뭐.. 간단한 실습.. ㅎㅎ
import java.awt.*;
import javax.swing.*;//스윙은 awt의 확장판이다.
//뭐 그런거지 ㅋㅋㅋㅋ
//그러니까 javax는 다 확장판으로 알수 있군 ㅎㅎ
class Study1029_1{
public static void main(String args[]){
String data[] = {"1","2","3","4"};
JFrame jf = new JFrame();
jf.setSize(400,600);
Container c = jf.getContentPane();
JPanel p = new JPanel();
p.setLayout(new GridLayout(3,2));
p.add(new JTextField(10));
p.add(new JPasswordField(10));
p.add(new JRadioButton("Radio"));
p.add(new JButton("Button"));
p.add(new JList(data));
p.add(new JCheckBox("체크박스"));
c.add(p);
jf.setVisible(true);
}
}
상당히 모양이 좀 고급스럽게 나온다. awt가 윈도우 98이라면,,
Swing은 윈도우xp정도 되겟다 ㅎㅎㅎ
StringTokenizer 클래스
음 이건 split 으로 대체해서 사용했던건데..;;
뭐 기능은 split이랑 같다.
public StringTokenizer(String, String) 파싱할 문자열과 토큰으로 사용한 문자열을 인수로 하는 생성자
public String nextToken() 파싱한 문자열을 차례로 반환한다.
public boolean hasMoreTokens() 파싱한 문자열이 더 있는지를 검사한다. True일 경우 nextToken() 메서드로 문자열을 구할 수 있다.
public int countTokens() 파싱된 문자열의 개수를 반환한다.
이런식의 메서드들이 있다. 생성자에서 구분자를 설정안하면 기본적인 구분자가
실행이 된다 뭐 스페이스라던지 탭이라던지 이런거 ㅋㅋ
JProgressBar컴포넌트
- 음.. 작업중인걸 보여주는 그런거? 흠..
이것은 생성자에서 미니멈값과 맥시멈값을 설정할수 있다.
뭐 진행율을 표시해주는 그런 거군.. 흠..
JTextArea 클래스
void append(String str) str을 편집하는 텍스트의 뒤에 추가로 붙인다.
void insert(String str, int pos) str을 편집하는 텍스트의 pos위치에 삽입한다.
void setFont(Font f) 글꼴을 f로 설정한다.
void setLineWrap(boolean wrap) 줄바꿈을 할 것인지를 설정한다.
String getText() 편집하는 텍스트를 반환한다.
void setText(String str) 편집텍스트를 str로 설정한다.
boolean requestFocusInWindow() 입력포커스(즉, 커서)를 해당 JTextArea객체에 준다.
void setCaretPosition(int pos) 입력커서의 위치를 지정한다. 디폴트는 제일처음..
뭐 문장이 있다면.. 맨뒤에 하고 싶기도 하니까 ㅋㅋㅋ
JScrollPane
-화면에 표시하는 윈도우창보다 표현할것이 더 클경우 사용..
뭐... 인터넷 창 생각하면 편하겟네 ㅎㅎㅎ
JOptionPane 클래스
-뭐.. 대화창을 띄우는 거라고 생각하면 되겠다. ㅎㅎㅎ
showConfirmDialog 예, 아니오 등의 확인 질문을 위한 대화창
showInputDialog 어떤 입력을 기다리는 대화창
showMessageDialog 사용자에게 무엇인가 발생했다는 것을 알리는 대화창
showOptionDialog 위 3개를 합친 기능의 대화창
JFileChooser 클래스
손쉽게 파일을 저장하거나 불러오는 건데.. ㅎㅎㅎ
왠지 복잡하다 ㅎㅎㅎ
뭐.. 흠... 갑자기 좀.. 고급스러워진거 같다 ㅎㅎㅎ
프로젝트도 이걸로 진행중이고 현재 ㅎㅎㅎ
좀 먼가 하는 기분이 들긴하더라 아직 허접하기 이를데가 없지만 ㅡㅡㅋ
금방 완성하리라 ㅋㅋㅋ
스윙쪽은 원래 있던 오리지널의 확장판 격인 패키지라 그렇게 많은 설명이 있지는 않았지만..;;
역시나 익숙하지 않은 것은 사실 ㅎㅎㅎ
이럴땐 api가 약이지 ㅋㅋㅋㅋ
마지막 메모장 예제 문제는 미처 해보지 못했다. 하는중 ㅎㅎ
다하면 올리기로 하고..;;
프로그래스바를 조금씩 손봤는데 사실 되기는 오래전부터 됫다.
근데 이놈의 것이 조금식 조금식 마음에 안드는 부분들을 가지고 있어서 그런것들을 처리하느라고 ㅋㅋ
좀 힘들었지 ㅋㅋㅋ 아니.. 뭐랄까 아무튼 생각을 많이 했었다.
소스는 ================================
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Study1103_1 {
static int i = 0, x = 0;
static boolean b = false;
static JProgressBar bar;
public static void main(String args[]){
SetBar sb = new SetBar();
JFrame f = new JFrame("프로그래스바 실습");
f.setSize(200,100);
Container c = f.getContentPane();
bar = new JProgressBar();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JButton b1 = new JButton("증가");
JButton b2 = new JButton("감소");
JButton b3 = new JButton("멈춤");
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
x = 1;
}
});
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
x = 2;
}
});
b3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
x = 0;
}
});
p1.add(bar);
p2.setLayout(new GridLayout(1,3));
p2.add(b1);
p2.add(b3);
p2.add(b2);
c.add(p1,"Center");
c.add(p2,"South");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true){
bar.setValue(sb.getvalue(x));
if (bar.getValue() >= bar.getMaximum()){
x = 0;
}
else if (bar.getValue() <= bar.getMinimum()){
x = 0;
}
f.setVisible(true);
}
}
}
class SetBar {
int i = 0;
public int getvalue(int index){
if (index == 1){
try{
Thread.sleep(100);
}catch(Exception ex){}
i++;
}
else if (index == 2) {
try{
Thread.sleep(100);
}catch(Exception ex){}
i--;
}
return i;
}
}
=======================================
실행결과는..;

이 프로그래스바가 이상한게 최소치 최대값을 위소스에서는 설정하지 않았는데..;;
설정해도 계속되는 증감값에 바로바로 대응을 못했다.
예를 들면..;;
증가를 눌르고 바에서 게이지가 차오르는 중간에 감소를 눌르면
바로바로 감소 되는 것을 볼수 있지만..;;
끝까지 다가고 가면..;; 게이지 끝까지 도달한 시간부터
감소나 멈춤을 눌르기 전까지의 시간도 왠지 보이지 않는 게이지 바가
계속 올라간다고 설명하면 쉽게 이해 할려나 어렵나?
아무튼..;; 끝에 가면 제데로 동작을 안하는것은 확실했다.
이사실에서 별로 어려운게 아니지만..; 내 추론이 맞다면..;;
프로그래스바의 Value의 최대 최소치는 정해져 있지만..
나의 프로그램에서 프로그래스바의 값을 넣을때 0보다 작은수나 100보다
큰수가 들어갈수 있겠금 설계가 되어있다.
그럴경우 지금까지의 자바소스들은 대부분들이 정해진 값의 범주를 넘어선 값이
생겨버리면 오류가 생겼으나..;;
이것은 그렇지 않았다. 그 숫자는 숫자대로 증감을 하고 프로그래스바는 최대 최소치에 묶여
변함이 없는것이다.
이를보아 추론하건대, 프로그래스바는 최대최소치의 값의 범주를 넘어서는 값이 들어오는 경우,,;;
무시하거나 아니면 현상태 유지? 이정도를 하도록 클래스가 이루어진것같다.
흠...
별거 없는 논리를 장황하게 늘여놓았지만..;;
사실은 이것때문에 애를 좀 먹었었다.
멍청하게도..;;
입력값 == setValue 로 생각을 오래동안 했으니
그것도 아주 당현하게도 말이다.
멍청하긴 ㅡㅡㅋ
회의감에 한숨 쉬고..;; ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
오늘은 일단 여기서 끝~ ㅋㅋㅋㅋㅋ
# by | 2008/11/04 16:02 | 실험프로젝트2학기 | 트랙백 | 덧글(1)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]