2014-01-14 2 views
0

Java 프로그램을 작성하는 동안 몇 가지 JPanels에서 동일한 메서드 세 개를 사용하여 나 자신이 일부 typing을 생략하고 JPanel을 이러한 메서드 만 포함 된 추상 클래스로 확장 한 다음, 내 패널에 추상 수업?상속 된 JPanel 프로그램을 잠그기

예, 프로그램은 현재 정확히 아무것도 수행하지 않습니다. 윈도우를 표시하지도 않고 NetBeans에 따르면 일반적으로 12 개가 넘는 반면 2 개의 스레드 만 실행합니다.

다음은 추상 클래스는 다음과 같습니다

import ControlClasses.MainWindow; 
import ControlClasses.MethodLibrary; 
import java.awt.Component; 

public abstract class CustomPanel extends javax.swing.JPanel { 

    protected MainWindow parent; 
    protected MethodLibrary library; 

/** 
* Sets the owner of this panel for the purpose of method calls. 
* @param parentFrame The JFrame this panel is located on. 
*/ 
public void setParent(MainWindow parentFrame){ 
    this.parent = parentFrame; 
} 

/** 
* If the panel is on a JLayeredField, this can be used to disable all components 
* in order to prevent user input from reaching this panel instead of the intended one. 
* @param mode The state to set all controls to. 
*/ 
public void changeFunctionality(boolean mode){ 
    for(Component comp : this.getComponents()){ 
     comp.setEnabled(mode); 
     comp.setVisible(mode); 
    } 
} 

/** 
* Adds the method library to the class. 
* @param library The library's handle. 
*/ 
public void addLibrary(MethodLibrary library){ 
    this.library = library; 
} 
} 

내가 여기서 뭔가를 놓친 건가?

+3

나는 당신의 문제가 다른 곳에있을 것을 제안하고 싶다 ... – MadProgrammer

+2

아마 문제는 아니지만 시각적 인 혼동을 피하고 컴파일러를 좀더 엄격하게 (그리고 가능한 문제를 지적하기 위해)'@ Override'를 사용해야한다. 클래스를 확장 할 때 주석. – SnakeDoc

+3

여기에 뭔가 빠졌습니까? - 예 [MCVE] (http://stackoverflow.com/help/mcve), 짧은, runnable, compilable 및 실제 대답은 내가 거기에 대한 기대 목표에 대한 설명 – mKorbel

답변

0

이 솔루션은 전혀 관련이없는 패널에있었습니다.

나는 KeyListener와 MouseMotionListener가있는 다른 패널을 작성했지만 전체 설정이 LayeredPane에 있었기 때문에 잘못된 패널이 마우스 입력을받는 데 이전의 문제가있었습니다. 따라서, 나는 다음과 같이 청취자를 해제하려고 :

KeyListener kListener = new KeyListener(){ events for the listener, not important here }; 
MouseMotionListener mListener = new MouseMotionListener() { ditto }; 
synchronized (kListener){ 
    kListener.wait(); 
} 
synchronized (mListener){ 
    mListener.wait(); 
} 

의도가 필요할되면) (통지 리스너이었고, 다시 한 번 불필요한) (기다려야합니다. 그러나 액션 리스너는 쓰레드가 아닙니다. 내가 기다리라고 말했을 때 명령은 이벤트 디스패치 스레드에서 실행되어 자동으로 프로그램을 복구 할 수없는 무한 루프에 넣었습니다. 절대로 오지 않을 notify()를 기다리고있는 EDT를 기다리는 모든 사람들과 함께 - 고전적인 예 교착 상태. 프로그램이 창을 표시하지 않은 이유는 프로그램이 여전히 초기화되는 동안 EDT가 중단되어 프로그램의 기본 창의 생성자 중간에서 중지 되었기 때문에 표시 할 창이 있기 때문입니다.

해결 방법 : NetBeans가 비 최종 필드에서 synchronize()를 실행하려고 할 때 경고하면 을 수신합니다. 이유가인데주의를 끌려고합니다. 그것은 어리석은 실수 였지만 적어도 그것은 무해한 실수였다.