为什么不使用场景生成器和Eclipse使用FXML for JavaFX显示图像?

时间:2014-07-06 22:10:48

标签: image javafx fxml

我使用带有几个按钮的Scenebuilder构建了一个简单的GUI。在SceneBuilder中,一切都很好。

但是当我运行程序时,除了一个按钮之外的所有按钮,所有的ImageViewers'图像显示正常。我之前遇到过这个问题,在清理完项目之后,事情就出现了,但不是这次。我使用文档引用指向图像,并且所有使用的图像都存在,即它们与fxml和控制器类在同一目录中。

知道问题背后可能是什么原因?

编辑: 这是(缩短的)fxml代码

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

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

<fx:root onMouseDragged="#onMouseDrag" onMouseEntered="#onMouseEnter" onMouseExited="#onMouseExit" prefHeight="500.0" prefWidth="600.0" type="VBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <ToolBar onMouseDragged="#onMouseDrag" onMouseEntered="#onMouseEnter" onMouseExited="#onMouseExit" prefHeight="0.0" prefWidth="376.0">
        <items>
            <Button fx:id="closeButton" mnemonicParsing="false" onAction="#closeWindow">
               <graphic>
                  <ImageView fitHeight="40.0" fitWidth="40.0" pickOnBounds="true" smooth="false">
                     <image>
                        <Image url="@images/close-32.png" />
                     </image>
                  </ImageView>
               </graphic>
            </Button>
        </items>
      </ToolBar>
   </children>
</fx:root>

这是简单的控制器。我明确地在托管阶段调用设置

public LogViewerControllerFX() {
    Platform.setImplicitExit(false);
}

public void setup() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(
            "LogViewerFX.fxml"));

    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

    try {
        fxmlLoader.load();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是舞台:

import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class LogViewerDialogFX extends Stage {

    public LogViewerDialogFX() {
        LogViewerControllerFX logViewController = new LogViewerControllerFX();
        logViewController.setup();  

        Scene scene = new Scene(logViewController);
        scene.setFill(Color.TRANSPARENT);
        setScene(scene);
        initStyle(StageStyle.TRANSPARENT);
        initModality(Modality.WINDOW_MODAL);
        setTitle(I18N.getText("title.logViewer"));
        getIcons().add(new Image("net/logviewer/image/logs-25.png"));
    }
}

当然,这一切都发生在JavaFX线程中。

3 个答案:

答案 0 :(得分:1)

也许尝试重建你的eclipse项目。 或者尝试将图像设置为css。

<Button styleClass="Button-Image"/>

.Button-Image{
    -fx-graphic: url('images/close-32.png');
}

答案 1 :(得分:1)

如果我错了,请纠正我,但请看一下:

<Image url="@images/close-32.png" />

指&#39; / images /&#39;中的图像。夹。但是:

getIcons().add(new Image("net/logviewer/image/logs-25.png"));

指&#39; / image /&#39;中的图像。夹。 如您所见,它们都指向不同的文件夹。您可能想要检查哪一个是正确的,&#39; image /&#39;或&#39;图像/&#39;文件夹中。

答案 2 :(得分:0)

我不确定这是否构成了一个好的答案,但我通过重做所有涉及的图像的引用(它们在fxml上的结果相同)来重新启动Eclipse和SceneBuilder,并完成了所有项目的完整清理。

就像我之前注意到的那样,只有在清理之后,SceneBuilder中的更改才能在Eclipse中使用。我不确定它是否是e(fx)clipse插件,或者Eclipse如何处理fxml文件,但在那个特定的过程中肯定需要改进。