簡體   English   中英

Java FXML:為什么我的imageView沒有顯示,如何從計算機上載圖像?

[英]Java FXML: Why is my imageView not Showing, and how can I upload an image from my computer?

我正在做一個項目,需要上傳圖像並對其應用一些過濾器。 為此,我正在使用javaFx FXML。 這是我第一次使用此工具,所以我有些失落。 我使用fxml控件創建了一個簡單的界面,並添加了一些按鈕以及一個imageView字段。 在圖像視圖字段中,我還添加了一個默認圖像,該默認圖像在我應用該圖像時會正常顯示,但是當我實際運行該項目時它不會顯示該圖像,我所看到的只是應該放置圖片的空白區域。 有人知道為什么會發生嗎? 另外,正如你們將在代碼中看到的那樣,我想知道如何訪問imageView src,以便我可以上載圖像並隨時使用JFileChooser對其進行更改。 非常感謝你。

Controler

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package fotofinish;

import java.awt.BorderLayout;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author user
 */
public class FXMLDocumentController implements Initializable {
    private JPanel      jpanel, jpanelbar;
     JLabel              image;
    private Label label;
    @FXML
    private Button filterGrayscaleButton;
    @FXML
    private Button filterSepiaButton;
    @FXML
    private Button filterInstantButton;
    @FXML
    private Button filterCustomButton;
    @FXML
    private Button filterNoneButton;
    @FXML
    private Slider brightnessSlider;
    @FXML
    private Slider contrastSlider;
    @FXML
    private ToggleGroup brushTypeRadioGroup;
    @FXML
    private RadioButton brushTypeCircleRadioButton;
    @FXML
    private RadioButton brushTypeSpraypaintRadioButton;
    @FXML
    private RadioButton brushTypeSquareRadioButton;
    @FXML
    private MenuItem menubarHelpFotoFinishHelpMenuItem;
    @FXML
    private MenuItem menubarHelpAboutMenuItem;
    @FXML
    private Label filtersLabel;
    @FXML
    private Label sliderLabel;
    @FXML
    private Label brightnessLabel;
    @FXML
    private Label contrastLabel;
    @FXML
    private Label drawingLabel;
    @FXML
    private ColorPicker brushColorPicker;
    @FXML
    private Label brushTypeLabel;
    @FXML
    private Label brushSizeLabel;
    @FXML
    private TextField brushSizeTextField;
    @FXML
    private MenuItem menubarFileNew;
    @FXML
    private MenuItem menubarFileOpen;
    @FXML
    private MenuItem menubarFileGalleryButterfly;
    @FXML
    private MenuItem menubarFileGalleryTeddyBear;
    @FXML
    private MenuItem menubarFileGalleryPrincess;
    @FXML
    private MenuItem menubarFileGalleryFirefighter;
    @FXML
    private MenuItem menubarFileSave;
    @FXML
    private MenuItem menubarFileSaveAs;
    @FXML
    private MenuItem menubarFileQuit;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //TODO: make call function only when value changes by certain threshold
        brightnessSlider.valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                System.out.println("TODO: brightness changed to " + newValue);
            }
        });

        contrastSlider.valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                System.out.println("TODO: contrast changed to " + newValue);
            }
        });
    }

    @FXML
    private void applyFilterGrayscale(ActionEvent event) {
        System.out.println("TODO: grayscale filter applied");
    }

    @FXML
    private void applyFilterSepia(ActionEvent event) {
        System.out.println("TODO: sepia filter applied");
    }

    @FXML
    private void applyFilterInstant(ActionEvent event) {
        System.out.println("TODO: instant filter applied");
    }

    @FXML
    private void createFilterCustomPopup(ActionEvent event) {
        System.out.println("TODO: launched custom filter popup");
    }

    @FXML
    private void applyFilterNone(ActionEvent event) {
        System.out.println("TODO: none filter applied");
    }

    @FXML
    private void changeBrushTypeCircle(ActionEvent event) {
        System.out.println("TODO: brush type changed to circle");
    }

    @FXML
    private void changeBrushTypeSquare(ActionEvent event) {
        System.out.println("TODO: brush type changed to square");
    }

    @FXML
    private void changeBrushTypeSpraypaint(ActionEvent event) {
        System.out.println("TODO: brush type changed to spraypaint");
    }

    @FXML
    private void displayHelpDoc(ActionEvent event) {
        System.out.println("TODO: launched help document");
    }

    @FXML
    private void displayAboutDialog(ActionEvent event) {
        System.out.println("TODO: created about dialog");
    }

    @FXML
    private void changeBrushColor(ActionEvent event) {
        System.out.println("TODO: brush color changed to <BRUSH COLOR>");
    }

    @FXML
    private void adjustBrushSize(ActionEvent event) {
        System.out.println("TODO: brush size changed to <BRUSH SIZE>");
    }

    @FXML
    private void openFile(ActionEvent event) {
        System.out.println("TODO: launched file picker");
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.showOpenDialog(null);
        File f = fileChooser.getSelectedFile();
        System.out.print(f.getAbsolutePath());
        //image = new JLabel("", new ImageIcon(f.getAbsolutePath()), JLabel.CENTER);
        //jpanel.add(image, BorderLayout.CENTER);
        //jpanel.revalidate(); //ADD THIS AS WELL
        //jpanel.repaint();
    }

    @FXML
    private void openFileGalleryButterfly(ActionEvent event) {
        System.out.println("TODO: opened butterfly file from gallery");
    }

    @FXML
    private void openFileGalleryTeddyBear(ActionEvent event) {
        System.out.println("TODO: opened teddy bear file from gallery");
    }

    @FXML
    private void openFileGalleryPrincess(ActionEvent event) {
        System.out.println("TODO: opened princess file from gallery");
    }

    @FXML
    private void openFileGalleryFirefighter(ActionEvent event) {
        System.out.println("TODO: opened firefighter file from gallery");
    }

    @FXML
    private void saveFile(ActionEvent event) {
        System.out.println("TODO: saved file");
    }


    @FXML
    private void saveFileAs(ActionEvent event) {
        System.out.println("TODO: launched file save as dialog");
    }


    @FXML
    private void quit(ActionEvent event) {
        System.exit(1);
        System.out.println("TODO: quit program");
    }

    @FXML
    private void createNewFile(ActionEvent event) {
        System.out.println("TODO: created new file");
    }
}

FXML`

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.input.*?>
<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fotofinish.FXMLDocumentController">
   <top>
      <MenuBar BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
                  <MenuItem fx:id="menubarFileNew" mnemonicParsing="false" onAction="#createNewFile" text="New">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="N" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
                     </accelerator>
                  </MenuItem>
                  <SeparatorMenuItem mnemonicParsing="false" />
                  <MenuItem fx:id="menubarFileOpen" mnemonicParsing="false" onAction="#openFile" text="Open">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="O" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
                     </accelerator>
                  </MenuItem>
                  <Menu mnemonicParsing="false" text="Open from Gallery">
                    <items>
                      <MenuItem fx:id="menubarFileGalleryButterfly" mnemonicParsing="false" onAction="#openFileGalleryButterfly" text="Butterfly" />
                        <MenuItem fx:id="menubarFileGalleryTeddyBear" mnemonicParsing="false" onAction="#openFileGalleryTeddyBear" text="Teddy Bear" />
                        <MenuItem fx:id="menubarFileGalleryPrincess" mnemonicParsing="false" onAction="#openFileGalleryPrincess" text="Princess" />
                        <MenuItem fx:id="menubarFileGalleryFirefighter" mnemonicParsing="false" onAction="#openFileGalleryFirefighter" text="Firefighter" />
                    </items>
                  </Menu>
                  <SeparatorMenuItem mnemonicParsing="false" />
                  <MenuItem fx:id="menubarFileSave" mnemonicParsing="false" onAction="#saveFile" text="Save">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="S" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
                     </accelerator>
                  </MenuItem>
                  <MenuItem fx:id="menubarFileSaveAs" mnemonicParsing="false" onAction="#saveFileAs" text="Save As">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="S" control="DOWN" meta="UP" shift="DOWN" shortcut="UP" />
                     </accelerator>
                  </MenuItem>
                  <SeparatorMenuItem mnemonicParsing="false" />
              <MenuItem fx:id="menubarFileQuit" mnemonicParsing="false" onAction="#quit" text="Quit">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="C" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
                     </accelerator></MenuItem>
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem fx:id="menubarHelpFotoFinishHelpMenuItem" mnemonicParsing="false" onAction="#displayHelpDoc" text="Foto Finish Help">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="F1" control="UP" meta="UP" shift="UP" shortcut="UP" />
                     </accelerator></MenuItem>
                  <MenuItem fx:id="menubarHelpAboutMenuItem" mnemonicParsing="false" onAction="#displayAboutDialog" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </top>
   <center>
      <SplitPane dividerPositions="0.14941569282136896" prefHeight="160.0" prefWidth="200.0" BorderPane.alignment="CENTER">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <VBox layoutX="-11.0" layoutY="25.0" prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                     <children>
                        <Label fx:id="filtersLabel" text="Filters" />
                        <Button fx:id="filterGrayscaleButton" mnemonicParsing="false" onAction="#applyFilterGrayscale" text="Grayscale" />
                        <Button fx:id="filterSepiaButton" mnemonicParsing="false" onAction="#applyFilterSepia" text="Sepia" />
                        <Button fx:id="filterInstantButton" mnemonicParsing="false" onAction="#applyFilterInstant" text="Instant" />
                        <Button fx:id="filterCustomButton" mnemonicParsing="false" onAction="#createFilterCustomPopup" text="Custom" />
                        <Button fx:id="filterNoneButton" mnemonicParsing="false" onAction="#applyFilterNone" text="None" />
                        <Label fx:id="sliderLabel" text="Sliders" />
                        <GridPane prefHeight="310.0" prefWidth="175.0">
                          <columnConstraints>
                            <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                            <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                          </columnConstraints>
                          <rowConstraints>
                            <RowConstraints maxHeight="88.0" minHeight="10.0" prefHeight="23.0" vgrow="SOMETIMES" />
                            <RowConstraints maxHeight="290.0" minHeight="50.0" prefHeight="287.0" vgrow="SOMETIMES" />
                          </rowConstraints>
                           <children>
                              <Label fx:id="brightnessLabel" text="Brightness" />
                              <Label fx:id="contrastLabel" text="Contrast" GridPane.columnIndex="1" />
                              <Slider fx:id="brightnessSlider" min="-100.0" minorTickCount="5" orientation="VERTICAL" showTickLabels="true" showTickMarks="true" snapToTicks="true" GridPane.rowIndex="1" />
                              <Slider fx:id="contrastSlider" min="-100.0" minorTickCount="5" orientation="VERTICAL" showTickLabels="true" showTickMarks="true" snapToTicks="true" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                           </children>
                        </GridPane>
                        <Label fx:id="drawingLabel" text="Drawing" />
                        <ColorPicker fx:id="brushColorPicker" onAction="#changeBrushColor" />
                        <Label fx:id="brushTypeLabel" text="Brush Type" />
                        <RadioButton fx:id="brushTypeCircleRadioButton" mnemonicParsing="false" onAction="#changeBrushTypeCircle" selected="true" text="Circle">
                           <toggleGroup>
                              <ToggleGroup fx:id="brushTypeRadioGroup" />
                           </toggleGroup>
                        </RadioButton>
                        <RadioButton fx:id="brushTypeSquareRadioButton" mnemonicParsing="false" onAction="#changeBrushTypeSquare" text="Square" toggleGroup="$brushTypeRadioGroup" />
                        <RadioButton fx:id="brushTypeSpraypaintRadioButton" mnemonicParsing="false" onAction="#changeBrushTypeSpraypaint" text="Spraypaint" toggleGroup="$brushTypeRadioGroup" />
                        <Label fx:id="brushSizeLabel" text="Brush Size" />
                        <TextField fx:id="brushSizeTextField" onAction="#adjustBrushSize" />
                     </children>
                  </VBox>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="369.0" prefWidth="465.0">
               <children>
                  <ImageView fx:id="AnchorPaneScrollPaneImageView" fitHeight="479.0" fitWidth="585.0" pickOnBounds="true" preserveRatio="true">
                     <image>
                        <Image url="@../../../../Pictures/images.png" />
                     </image>
                  </ImageView>
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </center>
</BorderPane>
`

您需要在Java控制器中創建對在FXML中定義的ImageView的引用。 您可以使用@FXML批注進行此操作。

目前您有:

<ImageView fx:id="AnchorPaneScrollPaneImageView" ...

可以使用,但是名稱很長,並且不遵循Java / FXML命名約定,即以小寫形式開頭實例變量的ID(這也是錯誤的,因為您沒有ScrollPane),因此只需將其更改為:

<ImageView fx:id="imageView" ...

然后在您的代碼中插入對它的引用(就像所有其他FXML定義的元素一樣):

@FXML
private ImageView imageView;

要選擇圖像,您可以編寫:

FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Image File");
fileChooser.getExtensionFilters().addAll(
     new ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"),
);
File selectedFile = fileChooser.showOpenDialog(mainStage);

而且,當您要將圖像設置為它時,可以執行以下操作:

if (selectedFile != null) {
    imageView.setImage(selectedFile.toURI().toURL());
}

注意:我尚未測試以上代碼片段。

在旁邊

除非確實需要,否則不建議將Swing和JavaFX混合使用,如果您只是在學習FXML,則完全不建議這樣做。 從您的代碼中刪除java.awt和javax.swing導入及其用法,並用JavaFX對應的功能替換其功能。 例如,JavaFX包含一個FileChooser ,因此您應該使用它而不是JFileChooser

暫無
暫無

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

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