无法在 Gluon 中使用按钮切换视图
Unable to Switch Views with Button in Gluon
我试着跟随 ,但这并没有改变我的观点。你能告诉我可能发生的事情,或者我是否遗漏了什么吗?在我尝试将按钮从一个视图切换到另一个视图的多个不同实例中,这在整个项目中都不起作用。
这是一个例子:
@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");
}));
}
}
切换视图时,您传递的字符串与注册时使用的字符串不一样。为确保匹配,请使用已在 MySecondApplication
class
中定义的常量
我试着跟随
@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");
}));
}
}
切换视图时,您传递的字符串与注册时使用的字符串不一样。为确保匹配,请使用已在 MySecondApplication
class