2016-06-07 3 views
0

Jframe을 확장하고 동일한 인터페이스를 구현하는 일부 클래스가 있습니다. 다른 클래스에서 java setVisible (true) 동일한 인터페이스를 구현하는 클래스

public class classe extends JFrame implements Elenco{ 
@Override 
    public void prova(){ 
    ....... 
    }  

} 

는 내가 가지고 내가 인터페이스 elenco를 구현하는 클래스를 표시 할 수있는 방법이 클래스에서

public class Selezione{ 
Elenco e; 
e.Prova(); 
} 

?
할 수 없습니다. e.setVisible (true);

나는이 솔루션을 시도하지만 당신은 인터페이스 ElencosetVisible 방법을 추가 할 필요가

public class Selezione{ 
Elenco e; 
public Modifica(){ 
e.Prova(); 

} 

public void Transfert(JFrame frame) { 
    frame = (JFrame) e; 

}

답변

0

작동하지 않습니다. 또는 Elenco에서 JFrame으로 유형을 변경하면 캐스팅과 함께 가능합니다.

public interface Elenco { 
    ... 
    public void setVisible(boolean visible); 
} 

public class Selezione { 
    Elenco e; 

    public void do() { 
     e.prova(); 
     e.setVisible(true); 
    } 
} 
0

당신이 Elenco 객체가 실제로 JFrame 있는지 여부를 확인하려면, 당신은 경우로 instanceof 연산자를 사용할 수 있습니다 :

또한 코드는 당신이 그것을 변경해야, 이런 식으로 작동하지 않습니다 성명 :

if (e instanceof JFrame) { 
    // Here I cast e to type JFrame 
    JFrame frame = (JFrame)e; 
    // Now you can call setVisible! 
    frame.setVisible(true); 
} 

기본적으로 캐스트입니다.

또는, setVisible라고 Elenco에 메서드를 추가 할 수 있습니다

interface Elenco { 
    void prova(); 
    void setVisible(boolean visible); 
} 

당신의 classeJFrameJFrame 이미 setVisble 방법을 포함하고 확장하기 때문에, 당신은 여분의 방법을 추가 할 필요가 없습니다. 두 번째 방법을 사용하는 경우

, 당신은 캐스트없이, e에 직접 setVisible를 호출 할 수 있습니다 : 당신이 JFrame에 다른 방법을 사용하려면

e.setVisible(true); 

, 당신도, 당신의 인터페이스에 추가 할 수 있습니다. 우리가 일치하는 클래스의 추상화를 유지해야하기 때문에

public class Selezione { 
    JFrame frame; 
} 

하지만 이것은 매우 권장하지 않습니다 :

세 번째 방법은 직접이 JFrameSelezione에 저장하는 것입니다.

0

문제는 필드 e가 참조 유형이 Elenco이고 컴파일 타임에 다른 메소드를 호출 할 수 없지만 해당 인터페이스에서 발견 된 메소드는 호출 할 수 없습니다. setVisible을 호출하려면 e를 클래스 classe로 캐스트해야합니다 (이것은 끔찍한 클래스 이름 임). 캐스팅 한 후 dirrectly setVisible()을 호출 할 수 있습니다. 다른 방법은 클래스의 prova 메소드 구현에 setVisible 코드를 추가하는 것입니다.

관련 문제