【问题标题】:Unable to Switch Views with Button in Gluon无法使用 Gluon 中的按钮切换视图
【发布时间】: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


【解决方案1】:

切换视图时,您传递的字符串与您在注册​​时使用的字符串相差不大。为确保匹配,请使用 MySecondApplication 类中已定义的常量

【讨论】:

  • 非常感谢!现在可以了。另一个相关的问题:我如何调用主视图,因为它没有定义为的常量。 (参考:public static final String PRIMARY_VIEW = HOME_VIEW;)
  • 切换到PRIMARY_VIEWHOME_VIEW 应该可以工作,因为它们本质上指向同一个常量。您应该始终使用常量来确保您永远不会遇到上述问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多