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

更新时间:2019-03-28 15:21:36 点击次数:1722次
首先是点击按钮弹出两个窗口的实现
**`

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

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!