javafx双屏上主页面操作实时刷新副页面的内容显示

本人也是javafx的小白,因为公司要开发客户端使用javafx技术,开发中遇到的一些坑分享给大家了解一下,话不多上,直接上代码

**

首先是点击按钮弹出两个窗口的实现

**`

try {
			//点击按钮正常跳转fxml页面的逻辑
			FXMLLoader loader = new FXMLLoader();
	        loader.setLocation(Main.class.getResource("view/answer/AnswerView.fxml"));
	        AnchorPane fingerView = (AnchorPane) loader.load();
	        AnswerController controller = loader.getController();
	        controller.rootVbox=rootVbox;
	        controller.setMain(main);
	        
	        //如果当前存在第二个窗口,先关闭
	        Stage stage2 = StageManager.STAGE.get("second");
	        if(stage2 !=null) {
	        	stage2.close();
	        }
	        
		        FXMLLoader loader2 = new FXMLLoader();
		   
	        	Stage stage = new Stage();
            	AsrUtils.getInstance().url=AsrUtils.getInstance().proMap.get("address").toString()+"/assessmentInHeart/toPsychologicalTest?id="+AsrUtils.getInstance().id+"&article_id=1&type=0&returnAddress=detailed";
            	loader2.setLocation(Main.class.getResource("view/answer/Guide.fxml"));
    	        AnchorPane yindao = (AnchorPane) loader2.load();
    	        
    	        GuideController controller2 = loader2.getController();
    	        //将第二个窗口放入管理类中
    	        StageManager.STAGE.put("second", stage);
//    	        rootVbox.getChildren().add(fingerView);
    	        controller2.setMain(main);
    			stage.setScene(new Scene(yindao));
    			stage.show();
	        
		} catch (Exception e) {
			e.printStackTrace();
		}

`

上文中StageManager.STAGE.put(“second”, stage);这个是我创建了一个stage管理类

public class StageManager {
	//Stage容器存储第二个窗口,用来点击第一个窗口中的按钮时方便操作第二个窗口
	public static Map<String, Stage> STAGE=new HashMap<String, Stage>();
	//controller管理类实际应用中其实没用到
	public static Map<String, Object> CONTROLLER=new HashMap<String, Object>();

}

现在已经实现点击按钮弹出两个窗口了,第二个窗口可以手动拖动到双屏的另外一个屏幕(双屏机器正常都可以设置两个屏幕显示不同东西,百度一下,很简单的)。

点击第一个窗口中的按钮,如果第一个窗口使用的fxml页面,在后台controller中可以直接获取到button,我这里第一个窗口是嵌入的html页面,所以先给html页面传过去回调的对象

public class ArchivesController extends BaseView implements Initializable {

	
	@FXML
	private WebView webView;
	private WebEngine webEngine;
	private OpenAppUtil openAppUtil = new OpenAppUtil();
	
	@Override
	public void initialize(URL location, ResourceBundle resources) {
		if(webView != null) {
			
		}else {
			webView= new WebView();
		}
		if(webEngine != null) {
			
		}else {
			webEngine = webView.getEngine();
		}
		webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
			public void changed(ObservableValue ov, State oldState, State newState) {

				if (newState == Worker.State.SUCCEEDED) { // 页面加载成功
					 JSObject win = (JSObject) webEngine.executeScript("window");
					 	//把页面回调的对象传到html页面
		                win.setMember("openAppUtil", openAppUtil);
				}
			}
		});
		
		//加载html页面AsrUtils.getInstance().proMap.get("address").toString()是我再配置文件中定义的html访问的前缀
		webEngine.load(AsrUtils.getInstance().proMap.get("address").toString()+"/test/index");
	}
	@Override
	public void setMain(Main main) {
		this.main = main;
		//设置页面的高度可以写死,可以忽略
		webView.setPrefHeight(main.rootLayout.getHeight() - 70);
		
	}
	
	//html 页面回调方法
   public class OpenAppUtil {
    	public void toFxml() {
    		
    		//从stage容器中取出第二个窗口,这里就可以操作第二个窗口了
    		Stage stage2 = StageManager.STAGE.get("second");
    		stage2.close();
    		try {
    		    //操作第二窗口去加载一个页面
    			FXMLLoader loader = new FXMLLoader();
    	        loader.setLocation(Main.class.getResource("view/answer/AnswerView.fxml"));
    	        AnchorPane fingerView = (AnchorPane) loader.load();

    	        rootVbox.getChildren().add(fingerView);
    	        
    	        AnswerController controller = loader.getController();
    	        
    	        
    	        controller.setMain(main);
    	        
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }   
}


html页面回调javafx的代码
html页面回调javafx的代码直接使用openAppUtil.自定义的方法即可。
到这里基本上就实现了,在第一个窗口中操作实时刷新第二个窗口中的页面,如果有任何问题欢迎咨询,我就是一个小白,如果文章中有误导之处,还请批评指正。

猜你喜欢

转载自blog.csdn.net/Lele___/article/details/88662998