Java FXML:为什么我的imageView没有显示,如何从计算机上载图像?

布鲁诺·布拉加(Bruno Braga)

我正在做一个项目,需要上传图像并对其应用一些过滤器。为此,我正在使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的Pyinstaller exe在启动Java程序的其他计算机上失败?

来自分类Dev

如何从java制作exe文件但在没有java的计算机上可执行

来自分类Dev

Java:为什么我的图像没有显示?

来自分类Dev

如何在具有其他Java版本的计算机上安装Java 8

来自分类Dev

如何在我的计算机上同时安装多个版本的Java JDK?

来自分类Dev

如何检查计算机上是否安装了Java

来自分类Dev

网站没有在我的计算机上显示

来自分类Dev

如何使Java客户端使用套接字连接到不在我的计算机上的服务器?

来自分类Dev

为什么没有显示我的标签?(Java)

来自分类Dev

使用Powershell invoke-expression在所有域计算机上卸载Java

来自分类Dev

如何在远程计算机上将Java与R集成?

来自分类Dev

如何在java中判断程序是否在Windows或Linux计算机上运行?

来自分类Dev

如何使用批处理文件在多手计算机上静默安装Java

来自分类Dev

如何在另一台计算机上使用java mysql程序

来自分类Dev

可以从Android在计算机上运行Java GUI吗?

来自分类Dev

使用Java获取差异计算机上的资源

来自分类Dev

如何在ms朋友计算机上使用ms访问数据库运行Java应用程序?在我的电脑上工作正常

来自分类Dev

为什么malloc没有“用完”计算机上的内存?

来自分类Dev

为什么kswapd0在没有交换的计算机上运行?

来自分类Dev

为什么kswapd0在没有交换的计算机上运行?

来自分类Dev

Selenium Java自动化在某些计算机上运行快而在某些计算机上运行慢

来自分类Dev

为什么Chrome在我的计算机上有这么多进程?

来自分类Dev

为什么我的网站证书在不同的计算机上具有不同的“颁发者”?

来自分类Dev

为什么我的所有帐户密码(在计算机上)都一样?

来自分类Dev

为什么编译时没有错误?为何它在32位计算机上而不是64位计算机上运行?

来自分类Dev

如何使用Tinymces文本编辑器从计算机上载图像?

来自分类Dev

从Java到MATLAB在计算机之间发送图像

来自分类Dev

为什么图像适合我的个人计算机,但在另一台计算机上却尺寸不一样?HTML / CSS

来自分类Dev

我的Java程序中没有显示图像

Related 相关文章

  1. 1

    为什么我的Pyinstaller exe在启动Java程序的其他计算机上失败?

  2. 2

    如何从java制作exe文件但在没有java的计算机上可执行

  3. 3

    Java:为什么我的图像没有显示?

  4. 4

    如何在具有其他Java版本的计算机上安装Java 8

  5. 5

    如何在我的计算机上同时安装多个版本的Java JDK?

  6. 6

    如何检查计算机上是否安装了Java

  7. 7

    网站没有在我的计算机上显示

  8. 8

    如何使Java客户端使用套接字连接到不在我的计算机上的服务器?

  9. 9

    为什么没有显示我的标签?(Java)

  10. 10

    使用Powershell invoke-expression在所有域计算机上卸载Java

  11. 11

    如何在远程计算机上将Java与R集成?

  12. 12

    如何在java中判断程序是否在Windows或Linux计算机上运行?

  13. 13

    如何使用批处理文件在多手计算机上静默安装Java

  14. 14

    如何在另一台计算机上使用java mysql程序

  15. 15

    可以从Android在计算机上运行Java GUI吗?

  16. 16

    使用Java获取差异计算机上的资源

  17. 17

    如何在ms朋友计算机上使用ms访问数据库运行Java应用程序?在我的电脑上工作正常

  18. 18

    为什么malloc没有“用完”计算机上的内存?

  19. 19

    为什么kswapd0在没有交换的计算机上运行?

  20. 20

    为什么kswapd0在没有交换的计算机上运行?

  21. 21

    Selenium Java自动化在某些计算机上运行快而在某些计算机上运行慢

  22. 22

    为什么Chrome在我的计算机上有这么多进程?

  23. 23

    为什么我的网站证书在不同的计算机上具有不同的“颁发者”?

  24. 24

    为什么我的所有帐户密码(在计算机上)都一样?

  25. 25

    为什么编译时没有错误?为何它在32位计算机上而不是64位计算机上运行?

  26. 26

    如何使用Tinymces文本编辑器从计算机上载图像?

  27. 27

    从Java到MATLAB在计算机之间发送图像

  28. 28

    为什么图像适合我的个人计算机,但在另一台计算机上却尺寸不一样?HTML / CSS

  29. 29

    我的Java程序中没有显示图像

热门标签

归档