2014-07-06 34 views
0

我已经用几个按钮构建了一个使用Scenebuilder的简单GUI。在SceneBuilder中,一切都显示正常。为什么不使用Scenebuilder和Eclipse使用FXML for JavaFX显示图像?

但是当我运行该程序时,除了一个按钮之外的所有按钮,它们的所有ImageViewer图像都正常显示。我之前遇到过这个问题,在清理完这个项目之后,事情就出现了,但这次不是。我使用文档引用来指向图像,并且使用的所有图像都存在,即它们与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线程内。

+0

根据我在你的描述中可以读到的内容几乎是不可能的。我的猜测是一个拼写错误的名字。你可以创建一个[MCVE](http://stackoverflow.com/help/mcve)吗? – Mansueli

+0

我一直在尝试,但它在其他地方起作用。我希望它拼写错误,但我检查了fxml,scenebuilder和图像本身,他们都检查出来。我每次在Scenebuilder中进行更改时都必须在Eclipse中清理和构建项目,这也有点令人烦恼,否则这些更改在运行时不会反映出来。也许这是问题的根源? –

+0

发布了FXML的代码以及您对非工作按钮的代码。添加了代码 – Mansueli

回答

0

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

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

+0

如果外部进程修改文件Eclipse默认情况下未检测到,但您需要点击刷新 - 您只能查看Preferences> Workspace并选中“使用本地钩子或轮询刷新” – tomsontom

+0

感谢您的提示!我希望它能起作用。我发现了另一个(可怕的)解决方法,即将图像直接复制到应该驻留的构建文件夹中。如果没有什么适合你的话,至少有最后的手段。 –

1

也许尝试重建您的eclipse项目。 或尝试在css上设置图像。

<Button styleClass="Button-Image"/>

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

我还没有测试过你的答案,但我不想接受我的答案,因为它不是一个很好的答案,而且你是唯一一个提供信用工作答案的人,所以信用是你的。 –

+0

如果有人尝试这样做 - 它不起作用 – Ghostli

+0

是的,而不是-fx-image,您必须使用-fx-graphic。编辑答案。 – Marcel

1

纠正我,如果我错了,但请看看这里:

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

指图像中的 '/图片/' 文件夹中。但是:

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

引用'/ image /'文件夹中的图像。如你所见,他们都指向不同的文件夹。你可能想检查哪一个是正确的,'image /'或'images /'文件夹。

+0

感谢您花时间回答。当我将发布的代码编辑到原来的样子时,这只是一个错字。在我的实际代码中,它是正确的。无论如何,自从我开始使用它以来,新的[SceneBuilder我使用gluOn](http://gluonhq.com/open-source/scene-builder/)从未给我这个问题。 –

相关问题