Clean Code that Works.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html


배열 카피하는 메소드.

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
          Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array.

요런다... 무슨말인고 하니..

src 의 srcPos 부터 desPos의 length 길이 만큼 dest 배열에다가 복사한다는 뜻.

SWT TEXT EVENT.

Java/이론..2008. 3. 26. 09:15
SWT에서TEXT에다가 엔터키 이벤트를 추가할 경우.
검색창에서 검색어 누르고 바로 엔터키 눌러서 검색하는 것 처럼.

아래 url 을 참고하세요.
http://www.java2s.com/Tutorial/Java/0280__SWT/TextdefaultselectioneventReturnEnterkey.htm

defaultSelection event를 사용하는 예제.
adapter도 제공 되기 때문에 아답터를 사용할지 리스너를 사용할지는 알아서~

아래는 adapter 사용할 경우의 예제.
keywordText = new Text(KeywordSearchGroup, SWT.BORDER | SWT.RIGHT);
keywordText.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
   public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
       System.out.println("widgetDefaultSelected");
   }
  });

Digester 를 사용할시에 commons-digester.jar 파일만 임포트 해서 사용하면 익셉션이 발생한다.

commons-collections.jar, commons-logging.jar, commons-beanutils.jar 파일도 빌드 패스에 추가해주자.

commons 파일들을 다운 받을수 있는 곳.
http://commons.apache.org/

XML 문서를 검색해야 하는 일이 생겼다.

Digester 와 Lucene 을 사용해서 파싱하고, 색인 만들고, 검색하는 예제.

http://www.ibm.com/developerworks/web/library/j-lucene/


2003년 글이네 -_-; 잘 될려나 몰라..

간단한 XML 에디터를 만들어 가고 있는중에...
XPATH를 사용하면 훨씬더 쉽게 검색할 수 있다는 사실을 발견...

OTL 그럼 전에 캐 삽질 DOM 트리 검색은....0_0?
XPATH로 고치는거 고고싱? ㅠ_ㅠ
귀찮다 OTL...일단 에디터 다 만들고 생각해 봐야지 ..

사용자 삽입 이미지

TreeViewer로 구현


마음 같아서야 이클립스에 포함된 XML 에디터 처럼 만들고 싶지만..
아직 허접해서 -_-;;

저기 펼쳐져 있는 트리중에 사진자료에 새로운 사진 노드를 추가하는 것부터 시작..

XPATH를 사용해서 할려고 하기때문에.. 대 난관에 봉착했지만..

다행이 해결 -ㅁ-v

일단 추가는 됬으니 자질구레한거 정리해서 하면 될것 같다..

이제그만 각설하고 소스를 살펴보면

일단 주요 내용을 살펴보면

문서를 파싱한다.
XPath로 객채를 만든다.
XPath표현식을 작성한다.
검색한 결과를 object로 저장하고.
여기에 새 엘리멘트를 추가한다.
그리고 최종적으로 메모리에 올라가 있는 돔 을 파일에 쓴다.


DocumentBuilderFactory domFactory = DocumentBuilderFactory
    .newInstance();

  //domFactory.setNamespaceAware(true); // never forget this!

  DocumentBuilder builder = domFactory.newDocumentBuilder();

  Document doc = builder.parse("VirusInformation.xml");

  XPathFactory factory = XPathFactory.newInstance();

  XPath xpath = factory.newXPath();

  XPathExpression expr = xpath.compile("//작물[@종류='채소']/병해/채소[@종류='오이']/병[@병명='노균병']/사진자료");

  Object result = expr.evaluate(doc, XPathConstants.NODESET);

  NodeList nodes = (NodeList) result;
 
  for (int i = 0; i < nodes.getLength(); i++) {
   Element e = (Element)nodes.item(i);
   Element newElement = doc.createElement("사진");
   Text objText = doc.createTextNode("사진 추가 연습");
   newElement.appendChild(objText);
   newElement.setAttribute("파일명", "1300.jpg");
   e.appendChild(newElement);
   System.out.println(nodes.item(i));
  }
 


  // 메모리에 추가한후 파일에 다시 쓰기.
 
  TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer;
  try {
   transformer = tFactory.newTransformer();
   transformer.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("VirusInformation.xml")));
  } catch (TransformerConfigurationException e) {
   e.printStackTrace();
  } catch (TransformerException e) {
   e.printStackTrace();
  }



이런 형식으로?
아 오전내내 삽질해서 성공했구나. OTL

만들고 있는 프로그램에 캠을 올려서 캡춰하는 것 까지 해야 한다.

일단 JMF가.. AWT를 기본으로 만들어 졌기때문에 SWT에 올라 갈런지는... 잘 모르겠다 -ㅁ-

아마 안올라 갈것 같은데.. 그럼 AWT 그대로 쓰는 수밖에 -ㅁ-

여튼 JMF 라이브러리를 사용해서 코딩후

실행 시켜보면

no jmvfw in java.library.path

이런 익셉션을 확인할 수 있다.
이런 경우 VM arguments를 설정해 주어야 하는데.

사용자 삽입 이미지

위와 같이 입력하면 실행되는것을 확인 할 수 있다.

프로젝트를 진행하던중.. (혼자하는 -_-;;)

동적으로 레이블을 생성해서 레이블을 클릭했을시 해당 레이블의 툴팁텍스트를 얻어 오려고 했더니
안되서 몇일간 좀 삽질을 했었다.

 for (i = 0; i < result.length; i++) {
   samples[i] = new CLabel(c, SWT.NONE);
   samples[i].setImage(resize(new Image(Display.getCurrent(), filePath + result[i]), 100, 100));
   samples[i].setToolTipText(result[i]);
   samples[i].addMouseListener(new MouseAdapter(){
    public void mouseDoubleClick(MouseEvent e) {
        System.out.println(samples[i].getToolTipText());
    }   
   } );


이렇게 할려고 했더니.. 당연히 i 값을 런타임에는 그 레이블 마지막 갯수 + 1로 고정이 되어 버리기 때문에 얻어 올 수가 없었다.
연구실 형이 알려줬는데.


   samples[i].addMouseListener(new MouseAdapter(){
    public void mouseDoubleClick(MouseEvent e) {
         System.out.println(((CLabel)e.getSource()).getToolTipText());    
    }   
   } );

위와 같이 마우스 이벤트로부터 getSource() 메소드로 얻어온걸 레이블로 캐스팅 해서 툴팁 텍스트를 얻어 올 수 있었다.

e.getSource();
라는거 처음 알았는데
자바독에서
return 값이 이벤트가 최초로 발생한 객체
라고 설명해 주네요.

지금 만드는 것도 대충 마무리가 되 가는데 어서 마무리하고 플러그인 프로젝트로 변신 시켜 봐야겠습니다.

XML 문서 파싱

Java/이론..2007. 10. 7. 10:14
지금 만들고 있는 이미지 검색 프로그램에 올리기 위한 데이터를 XML 파일로 만들었는데..

이것을 파싱해서 사용할려고 하다가 또 무수히 많은 삽질을...;;;

각설하고.. XML 문서를 파싱하는 예를 보도록 하자..

파서는 DOM 파서를 사용했는데 나중에 JDOM이나 SAX 파서로 바뀔수도 있겠다. 까먹지 말자.


DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("VirusInformation.xml");


DOM 파서를 만들어서 원하는 파일을 파싱 한다.

그 다음에

Node root = document.getDocumentElement();
System.out.print("Here is the document's root node:");
System.out.println(" " + root.getNodeName());
       
System.out.println("Here are its child elements: ");
       
rootNodes = root.getChildNodes();
       
Node vegetableNode = rootNodes.item(1);      

System.out.print(vegetableNode.getNodeName() + " ");
NamedNodeMap vegatables = vegetableNode.getAttributes();
System.out.println(vegatables.item(0));



하위 노드에 엘리먼트명과 속성명을 프린트해볼려고.. 무수한 삽질을.....

도큐먼트로부터 루트 노드를 생성하고 그 노드를 가지고 노드들을 만든다.

노드의 어트리뷰트를 얻을려면 노드에서 getAttributes를 가지고 NamedNodeMap 변수를 만들어서 할당하면

어트리뷰트를 출력 할 수 있다.

음.. SWT를 이용해 GUI 프로그램을 만드는 중이었는데..

그냥 이클립스의 프로젝트 클린 기능을 실행해 보았더니 갑자기..

Unable to load graphics library [GDI+ is required] 요런 익셉션이 발생했다.

익셉션이 발생한 구간은

GC.setAntialias(SWT.ON);
GC.setInterpolation(SWT.HIGH);

안티얼리어싱, 보간법 설정하는 부분이었다.

구글링을 해본결과...

마소 사이트에 가서 GDIPLUS.dll 파일을 다운로드한 후 windows/system32 폴더에 카피 하라고 하는데..

그 전에는 이런거 없이 잘 실행 됬지만 .. clean 을 실행한후 갑자기 안되었기때문에....

저렇게 해도 역시 안되었다..

oops.

그래서 익셉션이 SWT패키지에서 발생한것임을 생각해서 빌드패스에 SWT 를 추가하니깐 올바르게 실행되었다.

음.. 결론은 약간 삽질 -ㅁ-?

 

처음 예제부터 막혀서 -_-;;

여기저기 찾아 보았다. 루씬 버젼이 올라가면서 책에나온 소스가 deprecate 되어서 동작하지 않았다.

기존 예제를 보면

Document doc = new Document();
doc.add(Field.Text("contents", new FileReader(f)));
doc.add(Field.Keyword("filename", f.getCanonicalPath()));
writer.addDocument(doc);

이렇게 되어있는데 Field 에 Text, Keyword 스태틱 메소드(맞겠지 -ㅁ-?)가 사라져(deprecate) 버렸다.

Document doc = new Document();
doc.add(new Field("contents", new FileReader(f)));
doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.addDocument(doc);

Field의 매개변수 타입에 따라서 속성을 결정 하는 형식으로 바뀌었다.

http://lucene.zones.apache.org:8080/hudson/job/Lucene-Nightly/javadoc/index.html
루씬 doc 문서를 참조해서 이해 해볼려 했으나.. 이해가 잘 되니 않아 구글링으로 해결했다..OTL