2016-06-04 3 views
1

Swing에서 JavaFX로 GUI를 변환하는 중입니다. 따라서 사용자 정의 스타일링 작업을 더 쉽게 추가 할 수 있습니다.JavaFX 응용 프로그램에서 애플릿을 볼 수 없습니다.

내 응용 프로그램을 Swing에서 작업했지만 JavaFX에서 작동하도록 할 수 없습니다.

내가 원하는 것은 외부 애플릿을 SwingNode에로드하는 것이다. 애플릿에는 자동으로 재생되는 음악이 있고 나는들을 수 있지만 아무 것도 볼 수 없습니다.

관련 문서를 찾거나 도움을 얻으려고 애 쓰고 있습니다.

내 코드 :

ClientNew.java

package rsclient.coregui; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.util.concurrent.ExecutionException; 
import javafx.application.Application; 
import javafx.embed.swing.SwingNode; 
import javafx.scene.Scene; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.stage.Stage; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import rsloader.Loader; 

public class ClientNew extends Application { 

    @Override 
    public void start(Stage stage) throws InterruptedException, ExecutionException { 

     SwingNode swingNode = new SwingNode(); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final Loader loader = new Loader(Loader.Game.OSRS); 
       loader.applet.setLayout(null); 
       loader.applet.resize(800, 550); 

       JPanel gamepanel = new JPanel(new BorderLayout()); 
       gamepanel.add(loader.applet, BorderLayout.CENTER); 

       swingNode.setContent(gamepanel); 

       gamepanel.setVisible(true); 
      } 
     }); 

     Tab tab = new Tab(); 
     tab.setText("My Tab"); 
     tab.setClosable(false); 
     tab.setContent(swingNode); 

     TabP ane tabPane = new TabPane(); 
     tabPane.getStyleClass().add("tabbedPane"); 
     tabPane.getTabs().add(tab); 

     stage.setScene(
      new Scene(
       tabPane, 
       1000, 650 
      ) 
     ); 

     stage.setTitle("My APplication"); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Loader.java는 (나의 코드 그러나 작동하는 것 같다 윌 나중에 코스 리팩터링의.)

package rsloader; 

import java.applet.Applet; 
import java.applet.AppletContext; 
import java.applet.AppletStub; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import rsreflection.Reflector; 

/*** 
*@author Xel 
*@version 1.0 
*@project RSLoader 
*@file Loader.java 
*@date 18.10.2013 
*@time 10.43.48 
*/ 
public class Loader implements AppletStub{ 
    //insane declarations 
    public enum Game{OSRS, RS3, CLASSIC}; 
    public static final HashMap<String, String> Parameters = new HashMap<String, String>(); 
    public Game game; 
    public URL GamePack; 
    public Applet applet; 
    public String gameUrl; 
    public String MClass; 
    public Reflector loader; 

    public Loader(Game g) 
    { 
     game = g; 
     if(game == Game.OSRS) 
      gameUrl = "http://oldschool69.runescape.com/"; 
     else if(game == Game.RS3) 
      gameUrl = "http://world1.runescape.com/"; 
     else 
      gameUrl = "http://classic2.runescape.com/plugin.js?param=o0,a0,s0"; 

     try { 
      GetParams(new URL(gameUrl)); 
         loader = new Reflector(new URL[]{GamePack}); 
      applet = (Applet)loader.loadClass(MClass).newInstance(); 
      applet.setStub(this); 
      applet.init(); 
      applet.start(); 
     } catch (IOException | InstantiationException | IllegalAccessException | ClassNotFoundException e1) { 
      e1.printStackTrace(); 
     } 
    } 

    public void GetParams(URL url) throws IOException 
    { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
     String line; 
     List<String> params = new ArrayList<String>(); 
     while((line = reader.readLine()) != null) 
     { 
      if(line.contains("param name")) 
       params.add(line); 
      if(GamePack == null) //retarted block 
       if(line.contains("archive")) 
        if(game != Game.CLASSIC) 
         GamePack = new URL(gameUrl + line.substring(line.indexOf("archive=") + 8, line.indexOf(" ');"))); 
        else 
         GamePack = new URL("http://classic2.runescape.com/" + line.substring(line.indexOf("archive=") + 8, line.indexOf(" code"))); 
      if(MClass == null) 
       if(line.contains("code=")) 

         MClass = line.substring(line.indexOf("code=") + 5, line.indexOf(".class")); 
     } 
     reader.close(); 

     for(String s : params) 
     { 
      Parameters.put(GetParamName(s), GetParamValue(s)); 
     } 
    } 

    public String GetParamName(String param) 
    { 
     try{ 
      int StartIndex = param.indexOf("<param name=\"") + 13; 
      int EndIndex = param.indexOf("\" value"); 
      return param.substring(StartIndex, EndIndex); 
     }catch(StringIndexOutOfBoundsException e)//classic handles some differently so why not just catch it =P 
     { 
      int StartIndex = param.indexOf("<param name=") + 12; 
      int EndIndex = param.indexOf(" value"); 
      return param.substring(StartIndex, EndIndex); 
     } 
    } 

    public String GetParamValue(String param) 
    { 
     try{ 
      int StartIndex = param.indexOf("value=\"") + 7; 
      int EndIndex = param.indexOf("\">');"); 
      return param.substring(StartIndex, EndIndex); 
     }catch(StringIndexOutOfBoundsException e)//and again :D 
     { 
      int StartIndex = param.indexOf("value=") + 6; 
      int EndIndex = param.indexOf(">');"); 
      return param.substring(StartIndex, EndIndex); 
     } 
    } 

    @Override 
    public void appletResize(int arg0, int arg1) { 
    } 

    @Override 
    public AppletContext getAppletContext() { 
     return null; 
    } 

    @Override 
    public URL getCodeBase() { 
     try 
     { 
      if(game == Game.OSRS) 
       return new URL("http://oldschool1.runescape.com/"); 
      else if(game == Game.RS3) 
       return new URL("http://world1.runescape.com/"); 
      else 
       return new URL("http://classic2.runescape.com/"); 
     }catch(MalformedURLException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    public URL getDocumentBase() { 
     try 
     { 
      if(game == Game.OSRS) 
       return new URL("http://oldschool1.runescape.com/"); 
      else if(game == Game.RS3) 
       return new URL("http://world1.runescape.com/"); 
      else 
       return new URL("http://classic2.runescape.com/"); 
     }catch(MalformedURLException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    public String getParameter(String arg0) { 
     return Parameters.get(arg0); 
    } 

    @Override 
    public boolean isActive() { 
     return false; 
    } 
} 
+0

내가 아는 한, SwingNode는 경량 노드 만 표시합니다. 애플릿은 중량 클래스입니다. –

+0

흥미 롭다면 JLabel과 JButton과 같은 것을 시도해 보았습니다. 어떻게 확인할 수 있습니까? – RichardG

+0

대신 * webview *를 사용 하시겠습니까? 그것을 프레임에 삽입하십시오. –

답변

0

또한 JavaFX에 스윙 애플릿을 구현하려고했습니다. 나는 그 앱을 볼 수 없었다. 루트 창의 크기를 얻은 후에 Dimension이 0,0이라는 것을 알았습니다. 애플릿은 JavaFX로 자동 크기 조정되지 않습니다. JApplet에있는 내 init 메소드에 다음 행을 추가했습니다.

this.getRootPane().setMinimumSize(new Dimension(900,600)); 

이렇게하면 애플릿의 크기를 설정할 수있었습니다. 나는 리스너를 구현하여 윈도우 크기로 조정하려고한다.

+0

신난다. 이것이 어떻게되는지 알게 해주세요. – RichardG

관련 문제