簡體   English   中英

首次顯示視圖時查找失敗

[英]Lookup fails the first time a View is shown

重現問題的最小類:

import static com.gluonhq.charm.glisten.application.AppManager.*;

import javafx.application.Application;
import javafx.stage.Stage;

import com.gluonhq.charm.glisten.application.AppManager;
import com.gpsdemo.view.View1;
import com.gpsdemo.view.View2;

public class MyApplication extends Application {

    AppManager appManager = AppManager.initialize();

    public static final String VIEW1 = HOME_VIEW;
    public static final String VIEW2 = "View2";

    @Override
    public void init() {
        appManager.addViewFactory(VIEW1, View1::get);
        appManager.addViewFactory(VIEW2, View2::get);
    }

    @Override
    public void start(Stage stage) throws Exception {
        appManager.start(stage);
        if (com.gluonhq.attach.util.Platform.isDesktop()) {
            stage.setHeight(600);
            stage.setWidth(360);
            stage.centerOnScreen();
        }
    }

    public static void main(String args[]) {
        launch(args);
    }
}
import javafx.scene.control.Label;

import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import com.gpsdemo.MyApplication;

public class View1 extends View {

    private static View1 INSTANCE;

    public static View1 get() {
        return INSTANCE != null ? INSTANCE : (INSTANCE = new View1());
    }

    private View1() {
        setCenter(new Label("Nothing to see here"));
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setTitleText("View1");

        var optionsButton = MaterialDesignIcon.MENU.button(e -> getAppManager().switchView(MyApplication.VIEW2));
        appBar.getActionItems().add(optionsButton);
    }
}
import java.util.Set;

import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Node;

import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.SettingsPane;
import com.gluonhq.charm.glisten.control.settings.DefaultOption;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;

public class View2 extends View {

    private static View2 INSTANCE;

    public static View2 get() {
        return INSTANCE != null ? INSTANCE : (INSTANCE = new View2());
    }

    private View2() {
        var settingsPane = new SettingsPane();
        var option = new DefaultOption<>("Title", "Description", "Category", new SimpleDoubleProperty(), true);
        settingsPane.getOptions().add(option);
        setCenter(settingsPane);

        setOnShown(e -> {
            System.out.println("On shown");
            Set<Node> lookup = settingsPane.lookupAll(".secondary-graphic");
            System.out.println(lookup);
        });
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setTitleText("View2");

        var backButton = MaterialDesignIcon.ARROW_BACK.button(e -> getAppManager().switchToPreviousView().get());
        appBar.setNavIcon(backButton);
    }
}

正常啟動應用程序, View1將顯示。

單擊按鈕以顯示View2 第一次加載View2時,輸出為

On shown
[]

因此在onShown事件中lookup失敗。

單擊后退按鈕,然后再次顯示View2 輸出是

On shown
[HBox@2c8d8a10[styleClass=secondary-graphic]]

哪個是對的。

如果View2設置為HOME_VIEW ,查找將在第一個onShown事件上正確找到節點。 這對我來說似乎是一個錯誤。 無論如何,我希望第一次查找成功,以便正確配置視圖。

使用:

<javafx-maven-plugin-version>0.0.8</javafx-maven-plugin-version>
<gluonfx-maven-plugin-version>1.0.14</gluonfx-maven-plugin-version>

<java-version>17</java-version>
<javafx-version>18.0.1</javafx-version>
<charm-version>6.1.0</charm-version>

正如評論中提到的,問題是應用 css pass 后SHOWN事件不會發生,因此查找失敗。 修復可以是在SHOWN處理程序內部查找之前手動執行 css 傳遞:

setOnShown(e -> {
    System.out.println("On shown");
    settingsPane.applyCss();
    Set<Node> lookup = settingsPane.lookupAll(".secondary-graphic");
    System.out.println(lookup);
});

這是令人困惑的,因為SHOWN事件在視圖完全顯示后實際上並沒有發生(在這種情況下發生了 css 傳遞)。 該事件的行為也與 JavaFX 的對話框DIALOG_SHOWN事件不同,后者在對話框完全顯示后發生(包括 css 傳遞)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM