【发布时间】:2021-04-08 19:02:46
【问题描述】:
我尝试关注How to switch views in Gluon mobile app using javafx?,但它并没有改变我的观点。你能告诉我可能发生的事情吗,或者我是否遗漏了什么?在我尝试将按钮从一个视图切换到另一个视图的多个不同实例中,这不适用于整个项目。 这是一个例子:
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
appBar.setTitleText("No Account? Create one! ->");
appBar.getActionItems().add(MaterialDesignIcon.PERSON_ADD.button(e -> {
System.out.println("Switch to secondary view.");
MobileApplication.getInstance().switchView("SECONDARY_VIEW");
}));
}
作为参考,我的代码中没有其他错误,并且通过多视图侧边栏的所有视图和转换都运行良好。
编辑:根据请求,这是我将 SECONDARY_VIEW 添加到视图工厂的代码。
package com.mysecondapplication;
import com.mysecondapplication.views.PrimaryView;
import com.mysecondapplication.views.SecondaryView;
import com.mysecondapplication.views.TertiaryView;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.visual.Swatch;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
public class MySecondApplication extends MobileApplication {
public static final String PRIMARY_VIEW = HOME_VIEW;
public static final String SECONDARY_VIEW = "Secondary View";
public static final String TERTIARY_VIEW = "Tertiary View";
@Override
public void init() {
addViewFactory(PRIMARY_VIEW, PrimaryView::new);
addViewFactory(SECONDARY_VIEW, SecondaryView::new);
addViewFactory(TERTIARY_VIEW, TertiaryView::new);
DrawerManager.buildDrawer(this);
}
@Override
public void postInit(Scene scene) {
Swatch.AMBER.assignTo(scene);
scene.getStylesheets().add(MySecondApplication.class.getResource("style.css").toExternalForm());
((Stage) scene.getWindow()).getIcons().add(new Image(MySecondApplication.class.getResourceAsStream("/icon.png")));
}
public static void main(String args[]) {
launch(args);
}
}
编辑:实例化视图:
主视图
package com.mysecondapplication.views;
import com.gluonhq.charm.glisten.animation.BounceInRightTransition;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.FloatingActionButton;
import com.gluonhq.charm.glisten.control.Icon;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
public class PrimaryView extends View {
public PrimaryView() {
Label label = new Label("Hello JavaFX World!");
Button button = new Button("Change the World!");
button.setGraphic(new Icon(MaterialDesignIcon.LANGUAGE));
button.setOnAction(e -> MobileApplication.getInstance().switchView("SECONDARY_VIEW"));
VBox controls = new VBox(15.0, label, button);
controls.setAlignment(Pos.CENTER);
setCenter(controls);
}
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
appBar.setTitleText("No Account? Create one! ->");
appBar.getActionItems().add(MaterialDesignIcon.PERSON_ADD.button(e -> {
System.out.println("Switch to secondary view.");
MobileApplication.getInstance().switchView("SECONDARY_VIEW");
}));
}
}
次要视图
package com.mysecondapplication.views;
import com.gluonhq.charm.glisten.animation.BounceInRightTransition;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.FloatingActionButton;
import com.gluonhq.charm.glisten.control.Icon;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
public class SecondaryView extends View {
public SecondaryView() {
Label label = new Label("Hello JavaFX World!");
Button button = new Button("Change the World!");
button.setGraphic(new Icon(MaterialDesignIcon.LANGUAGE));
button.setOnAction(e -> System.out.println("Hello!"));
VBox controls = new VBox(15.0, label, button);
controls.setAlignment(Pos.CENTER);
setCenter(controls);
}
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
appBar.setTitleText("Have an Account? Log In! ->");
appBar.getActionItems().add(MaterialDesignIcon.PEOPLE.button(e -> {
System.out.println("Switch to Primary View.");
MobileApplication.getInstance().switchView("PRIMARY_VIEW");
}));
}
}
【问题讨论】:
-
您可以将部分添加到您创建的问题中并将
SECONDARY_VIEW添加到视图工厂吗? -
请阅读参考的帮助页面并采取相应措施
-
我不确定你的意思。我的代码可读、完整且可重现。我解释了这个问题并提到它有效。您希望我具体改变什么?
标签: javafx gluon gluon-mobile