2009-12-05 2 views
0

JFrame 객체가 있고 Mac OS X에서는 2 개의 JVM 1.5를, Windows에서는 1.6을 지원해야합니다. Windows에서는 setIconImages 함수를 사용하여 여러 아이콘을 응용 프로그램에 맞게 설정해야하지만이 함수는 1.5에서 사용할 수 없습니다. 리플렉션을 사용하여 JFrame 내부에서이 함수를 호출 할 수 있습니까?JVM 버전을 기반으로 함수 호출

Application extends JFrame{ 
. 
. 
. 
    void init(){ 
    //check version 
    //call setIconImages 
    } 

} 
+2

'java.naming'시스템 속성보다 'if'가 충분합니까? – miku

+0

MacOS에서 1.6을 사용할 수없는 이유는 무엇입니까? 내 말은, 당신이 승리를 최우선 과제로 삼고있는 것처럼 보입니다. 왜 맥이 아니겠습니까? – KitsuneYMG

+0

버전의 이름 지정/번호 매기기에 대한 표준이 없으므로 if는 매우 문제가됩니다. – TofuBeer

답변

2

내가 좋아하는 뭔가를 할 것이다 다음 (늘 '컴파일,하지만 당신은 시작 가야) :

라는 클래스 FrameUtils를 작성하고 다음 방법 제공 :

public static void setIconImages(final java.awt.Window window, 
           final List<? extends Image> icons) 
{ 
    try 
    { 
     Method setIconImagesMethod; 

     setIconImagesMethod = // use reflection to get the setIconImages method. 
     setIconImagesMethod.invoke(window, icons); 
    } 
    catch(final NoSuchMethodException ex) 
    { 
     // fall back to the single image method 
     window.setIconImage(icons.get(0)); 
    } 
} 

This link shows you how to get the method and call it via reflection.

+0

// 리플렉션을 사용하여 setIconImages 메소드를 가져옵니다. 이것은 실제로 나는 내가 미안한 질문을하는 이유는 무엇인지 알 수 없다면, 내가 가지고있는 객체의 메쏘드를위한 Method 객체를 얻을 수 있다는 것입니다. –

0

Java 1.5의 javax.swing.JFrame에는 setIconImage() 기능이 있습니다. 왜 여러 개의 이미지를 설정해야합니까?

+0

Windows 7은 여러 응용 프로그램 아이콘을 사용합니다. setIconImage()를 사용하면 다른 크기로 크기가 조정되고 아이콘이 지저분 해집니다. –

1

두 버전의 jdk를 별도로 컴파일해야하기 때문에 아마도 가장 좋은 해결책은 오래된 jdk에서 작동하지 않는 인터페이스와 두 가지 구현이있는 인터페이스를 갖는 것입니다. 그런 다음 시작시 필요한 구현을로드하십시오.

+0

+1 -이 접근법은 자연적으로 차이를 분리하기 때문에 반사보다 낫습니다. JDK 버전 사이. 또한 대부분의 경우 리플렉션을 사용하는 것보다 효율적이며 오류가 발생하기 쉽습니다. –

0

예, 반성은이 목적으로가는 길입니다.

"역 호환"이 필요한 일부 라이브러리에서이 트릭을 보았습니다. 이진 파일은 이전 VM에서 작동해야하므로 새로운 API는 리플렉션을 통해 액세스해야합니다.

+0

흠 ... 내가 바보 같은 말을했다고 생각해. 귀하의 경우, 그냥 일반적으로 어쨌든 메서드를 호출하고 1.6에서 컴파일하십시오. 1.5로 배포하면 메소드가 호출 될 때까지 잘 실행됩니다. NoSuchMethodException을 붙잡고 무시하십시오. – irreputable

+1

지난 번 1.5에서 1.6 컴파일 된 클래스를 실행했지만 실행되지 않았습니다. -target 및 1.5 부트 스트랩 클래스를 사용하여 컴파일해야합니다. –

0

Java 1.6으로 컴파일 할 수있는 경우 NoSuchMethodError를 잡아내는 간단한 방법이 있습니다. 다음은 작업 표시 줄에 대한 회계 화면의 경계를 얻을 내 코드에서 예이지만, 자바 버전이 너무 일찍 경우 다시 전체 범위에 해당 될

try { 
    sb=wnd.getGraphicsConfiguration().getBounds(); 
    } 
catch(NoSuchMethodError thr) { 
    Dimension ss; 
    ss=wnd.getToolkit().getScreenSize(); 
    sb=new Rectangle(0,0,ss.width,ss.height); 
    } 

당신이 J6가 변경 되었기 때문에 (반사를 사용해야하는 경우 J5로 컴파일해야합니다.) 그러면 리플렉션을 사용하여 J6 메서드를 추출하고 대체 호출을 실행하기 위해 MethodNotFoundException을 catch하면됩니다.