Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将.css动态添加到自定义Javafx线形图节点?_Java_Css_Dynamic_Javafx 2_Javafx - Fatal编程技术网

如何将.css动态添加到自定义Javafx线形图节点?

如何将.css动态添加到自定义Javafx线形图节点?,java,css,dynamic,javafx-2,javafx,Java,Css,Dynamic,Javafx 2,Javafx,所以,我的问题是:我试图为Javafx XYChart折线图定义一组自定义节点,其中每个节点对应于直接从数据集绘制的点。在环顾四周之后,Jewlesea实际上在某一点上找到了一个解决方案,即如何在折线图上的节点上添加动态标签,这给了我足够的推动力来创建黑色符号(它们目前是点,但它们可以是许多不同的东西)。现在我需要将XY图表上的一个节点更改为“X”。这可以通过加载图像来代替“节点”,也可以通过物理操作.css中的“shape”参数来实现 当我尝试动态添加此属性时,问题就开始了,因为哪个节点具有“

所以,我的问题是:我试图为Javafx XYChart折线图定义一组自定义节点,其中每个节点对应于直接从数据集绘制的点。在环顾四周之后,Jewlesea实际上在某一点上找到了一个解决方案,即如何在折线图上的节点上添加动态标签,这给了我足够的推动力来创建黑色符号(它们目前是点,但它们可以是许多不同的东西)。现在我需要将XY图表上的一个节点更改为“X”。这可以通过加载图像来代替“节点”,也可以通过物理操作.css中的“shape”参数来实现

当我尝试动态添加此属性时,问题就开始了,因为哪个节点具有“x”将始终在更改。以下是我尝试过的东西,它们都没有任何结果,不管使用了什么属性

  private XYChart.Data datum( Double x, Double y )
  {
      final XYChart.Data data = new XYChart.Data(x, y);
      data.setNode(
          new HoveredThresholdNode(x, y));
      //data.getNode().setStyle("-fx-background-image: url(\"redX.png\");");
      data.getNode().styleProperty().bind(
        new SimpleStringProperty("-fx-background-color: #0181e2;")
        .concat("-fx-font-size: 20px;")
        .concat("-fx-background-radius: 0;")
        .concat("-fx-background-insets: 0;")
        .concat("-fx-shape: \"M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,10 L0,10 L0,8 L4,5 L0,2 L0,0 Z\";")
         );
      data.getNode().toFront();
      return data;
  }
因此,在上面,您可以看到,这是在创建dataNode之后通过使用“bind”函数添加属性。另外请注意,我尝试在这个级别通过“setStyle”界面为其提供背景图像,但没有成功。而且,没有错误被抛出,没有“无效css”或类似的东西,只是这样做时根本没有在图形上显示

现在,在HoveredThresholdNode中(再次感谢Jewelsea是Javafx的大师并将这段代码放到了网上,它是这个类90%的源代码)我尝试了本质上相同的事情,在不同的级别上。(实际上是在节点创建类中,而不是在其上的层中)

类悬停ThresholdNode扩展堆栈窗格{
/**
* 
*@param x我们节点的x值(该值被传递给一个束)
*@param y我们节点的y值(也被传递给一个束)
*/
悬停ThresholdNode(双x,双y){
//图中每个节点的首选大小
//getStylesheets().add(getClass().getResource(“style/XYChart.css”).toExternalForm());
//getStyleClass().add(“xyChart节点”);
//不透明度(.8);
styleProperty().bind(
新的SimpleStringProperty(“-fx背景色:#0181e2;”)
.concat(“-fx字体大小:20px;”)
.concat(“-fx背景半径:0;”)
.concat(“-fx背景插图:0;”)
.concat(“-fx形状:\“M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,10 L0,10 L0,8 L4,5 L0,2 L0,0 Z\”;”)
);
//此标签是图形的“工具提示”标签。
最终标签=createDataThresholdLabel(x,y);
最终双Myx=x;
最终双Myy=y;
SetOnMouseCentered(新事件处理程序(){
@重写公共无效句柄(MouseEvent MouseEvent){
如果(Myx==0){
label.setTextFill(Color.DARKGRAY);
}如果(Myx>0),则为else{
标签:setTextFill(颜色:绿色);
}否则{
标签:setTextFill(颜色:耐火砖);
}
label.setText(“当前位置:“+Myx+”,“+Myy”);
//setCursor(Cursor.NONE);
toFront();
}
});
setOnMouseExited(新的EventHandler(){
@重写公共无效句柄(MouseEvent MouseEvent){
//getChildren().clear();
//setCursor(Cursor.CROSSHAIR);
}
});
}
现在请注意,我还尝试了
setStyle(java.lang.String)
方法,使用了所有相同类型的CSS,但没有成功。我不知道为什么这不是动态设计样式。这几乎就像自定义节点只是忽略了我在运行时定义的所有新的.CSS一样


任何帮助都将不胜感激,如果您需要任何细节或解释,请不要害羞。

因此,我最终找到了一个很好的解决方法来解决我的问题,尽管不是以我认为会发生的方式。我遇到的主要问题是,我从stackPane扩展到创建我的节点,它只有一个非常好的解决方案它有少量可用的图形显示选项,通过切换
“prefSize()”
属性,我只是简单地更改了堆栈窗格的大小,然后将堆栈窗格的背景区域填充为黑色,使其看起来非常具有欺骗性

因此,每当我到达需要放置红色“X”的节点时,我不使用堆栈窗格,而是调用一个不同的基准方法,该方法返回一个附加了ImageView的基准,如下所示:

  private XYChart.Data CoLDatum(Double x, Double y){
    final XYChart.Data data = new XYChart.Data(x, y);
    ImageView myImage = new ImageView(new Image(getClass().getResource("style/redX.png").toExternalForm()));
    data.setNode(myImage);
    data.getNode().setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          main_label.setText("Some Text.");
        }
      });
      data.getNode().setOnMouseExited(new EventHandler<MouseEvent>(){
        @Override public void handle(MouseEvent mouseEvent) {
          main_label.setText("");
        }
      });

    return data;
  }
private XYChart.Data CoLDatum(双x,双y){
最终XYChart.Data数据=新的XYChart.Data(x,y);
ImageView myImage=newimageview(新图像(getClass().getResource(“style/redX.png”).toExternalForm());
data.setNode(myImage);
data.getNode().setOnMouseEntered(新的EventHandler()){
@重写公共无效句柄(MouseEvent MouseEvent){
main_label.setText(“一些文本”);
}
});
data.getNode().setOnMouseExited(新的EventHandler()){
@重写公共无效句柄(MouseEvent MouseEvent){
主标签SETEXT(“”);
}
});
返回数据;
}
由于ImageView是一个节点的实现类,它工作得很好,允许我为图形中的一个节点加载一个图像,同时仍然维护一个侦听器,当鼠标悬停红色的“x”时,为我们的信息标签提供自定义文本。有时,简单的解决方案会从您身边滑过。

我想,如果我在
setStyle(java.lang.String)
方法中正确使用stackPane属性,它们肯定会出现,我只是在破坏堆栈窗格的本质。很有趣

希望这能帮助其他陷入类似问题的人

  private XYChart.Data CoLDatum(Double x, Double y){
    final XYChart.Data data = new XYChart.Data(x, y);
    ImageView myImage = new ImageView(new Image(getClass().getResource("style/redX.png").toExternalForm()));
    data.setNode(myImage);
    data.getNode().setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          main_label.setText("Some Text.");
        }
      });
      data.getNode().setOnMouseExited(new EventHandler<MouseEvent>(){
        @Override public void handle(MouseEvent mouseEvent) {
          main_label.setText("");
        }
      });

    return data;
  }