- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个项目,我需要上传图像并对其应用一些过滤器。为此,我使用 javaFx FXML。这是我第一次使用这个工具,所以我有点迷失。我使用 fxml Controller 创建了一个简单的界面,并添加了一些按钮和 imageView 字段。在 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 Controller 中创建对 ImageView 的引用您在 FXML 中定义。您可以使用 @FXML
annotation 来执行此操作.
目前你有这个:
<ImageView fx:id="AnchorPaneScrollPaneImageView" ...
这可以工作,但是名称有点长,并且不遵循以小写字母开头的实例变量 id 的 Java/FXML 命名约定(这也是错误的,因为您没有 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 .
关于Java FXML : Why is my imageView not Showing, 以及如何从我的计算机上传图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957686/
我的主 UI 是在 FXML 文件中定义的,并且应该包含人员列表。一个人会显示一张图片和一些不同的只读文本行(姓名、年龄等......)该列表本身在整个运行时会不断变化。 (增删改查) 我知道可以创建
正如标题所述,构建表并将所有内容添加到表的初始化方法与 FXMLLoader 之间存在一定的冲突,FXMLLoader 应该为弹出窗口加载 FXML。 我的代码: 主要: import javafx.
我正在创建丰富的 UI 应用程序,我在 FXML 中使用 FXML,每个部分都有单独的 Controller 。我决定关注this教程并使用我的 fxml 作为组件。所以我使用类作为 Controll
你好, 我有以下问题。 是否可以创建一个主 fxml 文件并放置/包含另一个应该具有用户定义属性的 fxml 文件。 例如,我有:main.fxml 和一个fan_object.fxml 然后将 3
我正在尝试制作一个具有用于制作新项目的对话框的应用程序。我已经对其进行了编程,但想要清理文件结构,因此我将对话框及其 Controller 的 fxml 移至它们自己的包中。该对话框的文件位于名为 n
你好, 我有以下问题。 是否可以创建一个主 fxml 文件并放置/包含另一个应该具有用户定义属性的 fxml 文件。 例如,我有:main.fxml 和一个fan_object.fxml 然后将 3
我的应用程序有选项卡式 Pane ,因此为了保持 fxml 文件易于管理,我有一个包含选项卡的主 fxml 文件,以及每个其他选项卡的单独 fxml 文件。这工作正常,但由于某种原因,应用程序已停止加
如果状态为“1”,我想加载另一个 FXML 文件。但在下面的代码中,它不会从初始化加载另一个 FXML。如果我使用按钮,那么此代码可以工作,但我想在没有任何按钮的情况下执行此操作。谁能帮我提个建议吗?
我是 JavaFX 的新手,我想知道是否有办法将一个 fxml 文件放在 child.fxml 中,例如 parent.fxml。 为什么我需要这个? 想法是,我想创建独立的屏幕(小屏幕)并编写一个父
我的程序有一个主要的 FXML 文档,其中包含 TabPane .对于每个选项卡,我希望它有自己的 Controller 和 fxml 文件。当我尝试将外部 fmxl 文件包含到主 fxml 文档中时
我有一个用 fxml 编写的边框 Pane ,它的左 Pane 和中央 Pane 具有可互换的布局。 边框 fxml:
在上面的 fxml 中,我有许多使用相同源 fx:include source="MyCombo.fxml"的 fxml include 标记。可以这样做吗?这样做会影响 F
我需要创建许多不同的 FXML 文件,并且每个文件都有一致的布局。每个都有一个 AnchorPane,它将保存单独的内容。 有没有办法加载“基本”FXML 文件,然后加载第二个 FXML 文件,并将数
我正在尝试创建一个非常简单的带有黑色背景的VBox。就这样。没有其他的。我使用 FXML 来描述我的 VBox。 样本.fxml: Controller .java: package sa
我不明白为什么我总是有同样的错误: image 当我尝试在我的strcuture项目中添加库(fx java)时。 我的build.gradle: plugins { id 'java'
这就是我想要实现的目标。 /Package A/ /Package A/ApplicationController.java /Package A/Application.fxml 在我的 Appli
我有两个 FXML 文件。第一个描述了要显示的第一个 Pane ,其中包含一个选项卡 Pane 、一个菜单和一个菜单项,该菜单项应该在选项卡 Pane 中打开一个新选项卡并在其中绘制一组新节点。这是代
我想要做的是,如果调整场景(应用程序窗口)的大小,我想相应地调整窗口内内容的大小。我已经发布了到目前为止我已经完成的代码 加载器类 public class ResizingButtons exten
我使用的是 Java JDK 13 和 FontAwesomeFX 11。 我有一个 FXML 文件,其中包含一些 FontAwesomeIconViews,但是当将该文件加载到我的 Controll
我明白了 javafx.fxml.LoadException: 当我使用以下代码行加载 fxml 文件时。 AnchorPane anchorPane = (AnchorPane)loader.loa
我是一名优秀的程序员,十分优秀!