我有一个简单的LineChart,按下按钮就会在一个新窗口中打开。此LineChart使用存储在硬盘上的图像作为背景。如果关闭提示LineChart的窗口,更改(或删除)图像文件并重新打开窗口,则会再次加载旧图像。我在场景构建器和代码中禁用了LineChart的缓存,但这没有帮助。
下面是我用于测试的LineChart-Controller的一个简单代码片段:
@FXML
private LineChart<?, ?> lineChart;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
lineChart.setCache(false);
Node chartNode = lineChart.lookup(".chart-plot-background");
chartNode.setCache(false);
chartNode.setStyle("-fx-background-image: url('file:///C://Temp//histData.png'); -fx-background-position: center center;");
}
谢了!
----更新----目前我使用带有ImageView和LineChart的StackPane来显示我的图像。但最初的问题仍然存在。一旦css加载了外部图像,即使文件本身发生了变化,也会显示相同的图像。
<?import javafx.scene.image.*?>
<?import javafx.scene.chart.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" cacheShape="false" prefHeight="500.0" prefWidth="812.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="chartbackgroundtest.ChartController">
<children>
<LineChart fx:id="lineChart" cacheShape="false" prefHeight="353.0" prefWidth="611.0" styleClass="mychart">
<xAxis>
<CategoryAxis side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis side="LEFT" />
</yAxis>
</LineChart>
</children>
</AnchorPane>
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.chart.LineChart;
public class ChartController implements Initializable {
@FXML
private LineChart<?, ?> lineChart;
Node chartNode;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
chartNode = lineChart.lookup(".chart-plot-background");
lineChart.getStylesheets().clear();
chartNode.setStyle(null);
chartNode.setStyle("-fx-background-image: url('file:///C://Temp//histData.png'); -fx-background-position: center;");
new File("C:\\Temp\\histData.png").renameTo(new File("C:\\Temp\\histData3.png"));
new File("C:\\Temp\\histData2.png").renameTo(new File("C:\\Temp\\histData.png"));
new File("C:\\Temp\\histData3.png").renameTo(new File("C:\\Temp\\histData2.png"));
chartNode.applyCss();
lineChart.requestLayout();
}
}
按钮的代码,打开对话框:
@FXML
private void handleButtonAction(ActionEvent event) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Chart.fxml"));
loader.setBuilderFactory(new JavaFXBuilderFactory());
Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
dialog.initModality(Modality.APPLICATION_MODAL);
try {
Scene scene = new Scene(loader.load());
dialog.setScene(scene);
dialog.show();
} catch (IOException ex) {
Logger.getLogger(MainViewController.class.getName()).log(Level.SEVERE, null, ex);
}
}
我建议您查看背景图像文件是否有变化,然后如果文件发生变化,将背景图像设置为空,然后将背景图像再次设置回文件以强制重新加载。参见:我可以用WatchService(不是整个目录)监视单个文件的更改吗?。
由于性能原因,setCache函数禁止JavaFX系统将节点缓存为内存中的映像;也就是说,当setCache处于打开状态时,它会向JavaFX提示,让它呈现一次节点,然后将其存储在缓存图像中。我不确定JavaFX是否为通过样式加载的图像提供了隔离缓存。如果这样做了,并且导致我前面的建议不起作用,那么您可以将图表放在一个StackPane中,图表位于顶部,在图表后面有一个用于背景视图的ImageView,然后当文件观察者检测到图像文件已经更改时加载一个新的图像(从而绕过JavaFX CSS系统可能有也可能没有的任何缓存机制)。
我正在尝试在javaFX场景中加载背景图像。我在这里找到的答案不起作用。窗口打开,但它是空白的(没有图像)。
我正在用java开发一个聊天机器人项目,在GUI中我使用JavaFX、IDE eclipse和scene builder 8.4.1。 我在向文本区域添加背景图像时遇到问题。这是我所做的一个屏幕截图,它什么也没有显示(甚至没有错误)。 以下是场景生成器生成的fxml代码:
我想在ImageView中将图像居中。ImageViews用于列表中图片的缩略图,我使用了宽度和高度为90的固定视口,使它看起来更干净。这些图片使用背景加载,所以我不知道图片放入ImageView时的尺寸。当然,我不想拉伸(或裁剪)图像。我在加载图像时使用preserveRatio。有什么方法可以让图像居中,而不是左上角?图像的最长边总是90度。
除了背景颜色,也可以使用背景图像来实现各种复杂、有趣的背景效果。CSS中,使用 background-image属性来定义背景图像的路径,取值为 none | url,默认值为 none。 url 可以是相对路径,也可以是绝对路径。使用相对路径时,url 是相对于 css 所在的文件,而不是要设置样式的HTML文件。如,下面代码表示,使用 css 文件所在目录下的 img 文件夹下的图像 bg.g
下面的外部CSS页面示例中的快速简单问题; 我知道它们会影响不同的元素选择器,我的问题是使用背景和背景图像有什么区别?一方可以访问另一方的特定属性吗?谢谢你。
问题内容: 我使用PHP库生成一些图像。 有时浏览器不会加载新生成的文件。 如何仅为我动态创建的图像禁用缓存? 注意:随着时间的推移,我必须对创建的图像使用相同的名称。 问题答案: 对于这个问题,一种常见而简单的解决方案是给每个对动态图像的请求添加一个随机生成的查询字符串,这种解决方案看起来很像黑客,但移植性很强。 因此,例如- 会成为 要么 从Web服务器的角度来看,可以访问同一文件,但是从浏览