首页 > 编程知识 正文

如何在javafx的面板中显示多行信息,javafx自定义控件加载异常

时间:2023-05-06 20:07:28 阅读:200207 作者:782

本人也是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 {@FXMLprivate WebView webView;private WebEngine webEngine;private OpenAppUtil openAppUtil = new OpenAppUtil();@Overridepublic 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");}@Overridepublic 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.自定义的方法即可。
到这里基本上就实现了,在第一个窗口中操作实时刷新第二个窗口中的页面,如果有任何问题欢迎咨询,我就是一个大胆的太阳,如果文章中有误导之处,还请批评指正。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。