자바에서 Swing을 사용할때 별 생각없이 만들다 보면,
EDT가 아닌곳에서 Swing Component에 대한 작업을 많이 하려고 한다.

다른 Thread에서 Swing Component에 대해서 어떠한 작업을 했을때,
dead lock이 일어나기 전에는,
어느곳에서 그런것을 썼는지 일일이 알아 내기가 힘들다.

Print 관련 자료를 찾다가 TroubleshootingGuide for Java를 발견해서
살짝 보았는데 참고해 두고 담에 체크할때 먹으면 좋아 보여서 긁어 놓는다.

TroubleshootingGuide for Java SE 6DesktopTechnologies
http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/TSG-Desktop.pdf

4.2.1 IncorrectThreading
Randomexceptions and painting problems are usually the result of incorrect threading usage of Swing. All access to Swing components, unless speciically noted in the javadoc,must be done on the event dispatch thread. This includes anymodels (TableModel, ListModel, and others) that are attached to Swing components.

The best way to check for bad usage of Swing is by way of an instrumented RepaintManager,as illustrated by the following code:

public class CheckThreadViolationRepaintManager extends RepaintManager {

    // it is recommended to pass the complete check
    private boolean completeCheck = true;

    public boolean isCompleteCheck() {
        return completeCheck;
    }

    public void setCompleteCheck(boolean completeCheck) {
        this.completeCheck = completeCheck;
    }

    public synchronized void addInvalidComponent(JComponent component) {
        checkThreadViolations(component);
        super.addInvalidComponent(component);
    }

    public void addDirtyRegion(JComponent component, int x, int y, int w, int h) {
        checkThreadViolations(component);
        super.addDirtyRegion(component, x, y, w, h);
    }

    private void checkThreadViolations(JComponent c) {

        if (!SwingUtilities.isEventDispatchThread() && (completeCheck || c.isShowing())) {

            Exception exception = new Exception();
            boolean repaint = false;
            boolean fromSwing = false;
            StackTraceElement[] stackTrace = exception.getStackTrace();

            for (StackTraceElement st : stackTrace) {
                if (repaint && st.getClassName().startsWith("javax.swing.")) {
                    fromSwing = true;
                }
                if ("repaint".equals(st.getMethodName())) {
                    repaint = true;
                }
            }

            if (repaint && !fromSwing) {
                //no problems here, since repaint() is thread safe
                return;
            }

            exception.printStackTrace();
        }
    }
}
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 무적조로™ 2008.11.05 12:59 신고

    어떤 내용인지 감이 잘 안잡힌다 ㅋㅋ
    다시 자세히 설명 좀 해보삼..

    • Chan 2008.11.08 00:55 신고

      뭐.. ㅎㅎ 굳이 깊이 알 필요는 없는.. ㅎㅎ
      알아두면 좋은거고. ㅎㅎ

      1. Swing에서 무언가 작업을 할때에는 EDT에서 해야 한다.
      2. 스윙에서 무슨 작업을 하고나면 보통 repaint를 호출하거나, 혹은 호출이 되는데
      3. 이때 만약 EDT가 아닌 Thread에서 호출하게 되면, 에러를 출력하는 코드

      정도 되는것 같은데. ㅎㅎ

      아직 한번도 안써봐서 ^^;;

코드인카페에 적었다고 옮겨 온글. 나중에 필요할것 같아서 검색편하게 하려고. ㅋㅋ
http://cafe.naver.com/javacircle/29760
==============

검색을 하다가 우연찮게 발견했는데.
알아 두면 좋으실것 같아 남겨 둡니다.

일반적으로 Java에서는 Native쪽을 잘 못 가져다 쓰지요.
( 웹브라우져, 미디어 플레이어, 플래시 플레이어 등등 .. )

가져다 쓰려고 하면 고난도 기술이 필요하거나 한데,
이미 만들어 둔 사람이 있네요.

http://djproject.sourceforge.net/ns/

물론 ; Windows 이외에는 잘 될런지는 책임 못 집니다.
( 제가 다 살펴 본게 아니라. ㅎㅎ )

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

Native Swing Demo Application

An integrated web browser.

It is possible to control opening windows and navigation, execute javascript, and a special channel for messages allows to receive custom messages from custom pages.

An integrated Flash Player.

This integrated player can be controlled from the Swing application (play, pause, stop, variables)

An integrated Multimedi Player (using VLC).

This integrated player can be controlled from the Swing application (play, pause, stop)

An integrated HTML editor (using FCK Editor).

This integrated editor can be controlled from the Swing application (get/set HTML, save event notifications)

An option allows to mix heavyweight and lightweight components while respecting their Z-order.

Another option defers destruction until garbage collection or explicit disposal, to permit the removal and later re-addition of a native component to the interface.

Here is another example of a component mix, in the form of a JDesktopPane.

Note the artificial addition of a Swing button on top of a Web Browser.

File associations utility.

It is possible to query registered applications for file types, and to launch files with their associated program.

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

테스트 해 보시려면 아래 링크를 누르면 webstart로 실행 됩니다.
여러개의 Native Object를 Java Frame안에서 겹쳐 놓을 수도 있고, 좋은것 같네요 ^_^

Webstart

Java Webstart

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

어제.. 하루 종일 집에서 뒹굴다가..
이게 뭐하는 짓인가 싶어서, 오늘 도서관에 갔습니다.

몇일전 팀장님께서 재미 있을거라면서 읽어 보라고 주신 책이 바로,
"뉴욕의 프로그래머" 이지요..

  뉴욕의 프로그래머  임백준 지음
뉴욕 월스트리트 금융회사에서 근무하는 프로그래머들의 이야기를 소설 형식으로 그렸다. 십수 명의 등장인물들이 저마다 독특한 개성과 프로그래밍 실력으로 만들어가는 이야기를 통해 프로그래머들의 창조적이고 예술적인 노동의 가치를 엿볼 수 있다.


"프로그램은 이러한 방법으로 짜야한다." 라는 어려운 책이 아닙니다.
그냥 뉴욕에 있는 프로그래머의 일을 다루는 소설책이죠 ^_^

한국에서 건너간 "영우"라는 주인공(당연히 프로그래머)이 나오고
그의 직업인 주식거래프로그램을 다루는 회사에서,
일어 나는 일을 바탕으로 하고 있습니다.

이것을 읽어 보면, 참으로 실무와 관련되는 내용이 많이 나옵니다.

1. 인텔리j를 IDE로 쓰고
2. Swing 으로 어플리케이션을 개발하고
3. Swing과 관련되는 Event Dispatch Thread ( EDT ) 내용도 나오고
4. 테스트를 위한 JUnit 도 나오고
5. 실제 데이터처리와 UI를 구분하라는 이야기도 나오고,
6. Java의 컨커런트패키지에 관련된 내용도 나오고
7. 버그는 어떤것은 지금 당장 고쳐야 하고 어떤것은 나중에 고쳐야 하는지..

등등 많이 등장합니다. ^_^


Java라는 언어는 무시하고라도, 프로그램 회사에서 나오는 일반적인 체계라던지 등은,
프로그래머를 꿈꾸는 초보자분들이나 대학생분들은 꼭 읽어 보았으면 하는 바람입니다.

Java를 실무를 다루시는 분은 그냥 재미삼아 읽어 볼만 하구요.
( 특히 Client단이 아니라, Server단 분들은.. ^_^ )
( 제가 다니는 회사가 국내에 몇안되는 Java Client Application 개발 회사라 ;; ㅋ )
( 우리회사에 들어온 신입이라면 반드시 읽어 보라고 하고 싶은 책이네요 ^_^ )
( 사실 저도 이 책을 읽으면서 몇가지 느낀것이. ㅋㅋㅋㅋㅋㅋㅋ )

다시 한번 말하지만, 이 책에는

"프로그램은 이러한 방법으로 짜야 한다." 라고 적혀있지는 않습니다.

하지만, 책을 다 읽고 나면
"프로그램은 이러한 방법으로 짜야 하는구나~" 라고 느낄 수 있을것입니다.
책의 절반이상이 버그와, 그 버그를 처리하는것에 대한 이야기가 나오거든요 ^_^

절대 어려운 책이 아닙니다.
가벼운 소설책 읽듯이 한번 읽어 보세요 ^_^

자기가 프로그래머라면, 혹은 프로그래머를 꿈꾼다면,
이 책을 지루하지 않게 읽을 수 있을것입니다. ^_^

물론, 진짜 실무에 있으신 분들은, 이깟것이라고 생각할 수도 있겠죠 ^_^

신고
크리에이티브 커먼즈 라이선스
Creative Commons License

+ Recent posts