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