मेरे पास मेरे JavaFX एप्लिकेशन में एक स्टैकपैन में नेस्टेड एक ImageView है:

UiManager.java

 @Override
    public void start(Stage primaryStage) {
        logger.info("Starting UI...");

        //Set the application icon.
        primaryStage.getIcons().add(getImage(ICON_APPLICATION));

        try {
            mainWindow = new MainWindow(primaryStage, logic);
            mainWindow.show(); //This should be called before creating other UI parts
            mainWindow.fillInnerParts();

        } catch (Throwable e) {
            logger.severe(StringUtil.getDetails(e));
            showFatalErrorDialogAndShutdown("Fatal error during initializing", e);
        }
    }

MainWindow.java

// Independent Ui parts residing in this Ui container
private ImagePanel imagePanel;
private PersonListPanel personListPanel;
private ResultDisplay resultDisplay;
private HelpWindow helpWindow;

@FXML
private StackPane imagePlaceholder;

@FXML
private StackPane commandBoxPlaceholder;

@FXML
private MenuItem helpMenuItem;

@FXML
private StackPane personListPanelPlaceholder;

@FXML
private StackPane resultDisplayPlaceholder;

@FXML
private StackPane statusbarPlaceholder;

void fillInnerParts() {
        imagePanel = new ImagePanel();
        imagePlaceholder.getChildren().add(imagePanel.getRoot());

        personListPanel = new PersonListPanel(logic.getFilteredPersonList(), logic.selectedPersonProperty(),
                logic::setSelectedPerson);
        personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());

        resultDisplay = new ResultDisplay();
        resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());

        StatusBarFooter statusBarFooter = new StatusBarFooter(logic.getAddressBookFilePath(), logic.getAddressBook());
        statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());

        CommandBox commandBox = new CommandBox(this::executeCommand, logic.getHistory());
        commandBoxPlaceholder.getChildren().add(commandBox.getRoot());

        //imagePlaceholder.getChildren().add(imagePanel.getRoot());
    }

ImagePanel.java

public class ImagePanel extends UiPart<Region> {

    private static final String FXML = "ImagePanel.fxml";

    @FXML
    private ImageView imageView;

    public ImagePanel() {
        super(FXML);
        imageView.setImage(new Image("/assets/1.png"));
    }

    public void updateView() {
        imageView.setImage(new Image("/assets/3.png"));
    }
}

मैंने प्रासंगिक भागों को यह देखते हुए निकाला कि मैं वास्तव में एक मौजूदा परियोजना को संशोधित कर रहा हूं।

यहां मैंने एक अलग विधि बनाने की कोशिश की updateView() जिसे मैं अपने कार्यक्रम में किसी अन्य वर्ग में new ImagePanel().updateView() कहूंगा

लेकिन इस मामले में, कोई फर्क नहीं पड़ता कि मैं updateView() कैसे कॉल करता हूं, छवि नहीं बदलती है।

0
Carrein 2 मार्च 2019, 20:23

1 उत्तर

सबसे बढ़िया उत्तर

संपादित करें: इस उत्तर को पोस्ट करने के बाद प्रश्न परिवर्तन था।

यह एक एमवीसीई है जो आपको जो चाहिए वह करता है (धीमी गति से स्टार्टअप क्योंकि यह वेब संसाधनों का उपयोग करता है)।
चलाएँ, और फिर सत्यापित करने के लिए इसे अपनी छवियों के साथ स्वैप करें:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Test extends Application{

    private static int counter =0;
    private ImageView iv;
    private Image[] images;
    private final String[] urls = {
            "https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/160/lg/57/tropical-fish_1f420.png",
            "https://www.shareicon.net/data/128x128/2015/03/28/14104_animal_256x256.png",
            "https://cdn1.iconfinder.com/data/icons/DarkGlass_Reworked/128x128/apps/gnome-fish.png",
            "http://www.iconsalot.com/asset/icons/freepik/pet-shop-13/128/010-fish-2-icon.png"
    };

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        images = new Image[urls.length];
        for(int i=0; i< urls.length; i++) {
            images[i] = new Image(urls[i]);
        }

        iv = new ImageView(images[counter++]);
        Button swapImage = new Button("Swap Image");
        swapImage.setOnAction(e->swapImage());
        BorderPane root = new BorderPane(iv);
        root.setBottom(swapImage);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.show();
    }

    private void swapImage() {
        counter = counter +1 >= images.length ? 0 : counter;
        iv.setImage(images[counter++]);
    }

    public static void main(String[] args)  {
        Application.launch(args);
    }
}
1
c0der 2 मार्च 2019, 18:32