我有一个简单的折线图,按下一个按钮就会在一个新窗口中打开。此折线图使用存储在硬盘上的图像作为背景。如果关闭计算折线图的窗口,更改图像文件(或将其删除)并重新打开窗口,则会再次加载旧图像。我在场景生成器和代码中禁用了折线图缓存,但没有任何帮助。
有人能给我一个提示我错过了什么吗?
下面是我用于测试的折线图控制器的简单代码段:
@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加载,即使文件本身发生了变化,也会显示相同的图像。
这是我更新的测试用例,当按下按钮时作为对话框加载。
fxml地址:
<?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();
}
}
我有两个不同的图像,histdata.png和histdata2.png。我的图表使用histdata.png作为图表打印背景的背景图像。打开对话框后,将切换histdata.png和histdata2.png文件。关闭对话框并按指定的按钮重新打开,原始图像仍会加载。
打开对话框时按钮的代码:
@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);
}
}
2条答案
按热度按时间kfgdxczn1#
我建议您观察背景图像文件的更改,如果文件发生更改,请将背景图像设置为null,然后再次将背景图像设置回文件以强制重新加载。请参阅:是否可以使用watchservice监视单个文件的更改(而不是整个目录)?。
由于性能原因,setcache函数禁止javafx系统将节点作为映像缓存在内存中;i、 当setcache打开时,它会提示javafx渲染节点一次,然后将其存储在缓存图像中。我不确定javafx是否对通过样式加载的图像有单独的缓存。如果是这样,并且这导致我之前的建议不起作用,您可以将图表放在堆栈窗格中,顶部是图表,后面是背景视图的imageview,然后在文件观察程序检测到图像文件已更改时加载一个新图像(从而绕过javafxcss系统可能具有或不具有的任何缓存机制)。
oyxsuwqo2#
我建议您使用不同的名称保存文件,并使用不同的名称调用setstyle。