图标JavaFX的相同节点参考的多个按钮

时间:2015-07-06 16:54:38

标签: java javafx

我有以下代码:

public class OrdemProducaoDialog extends Application implements Initializable{

@FXML
private VBox content;

@FXML
private Button btBuscaOrdem;

@FXML
private Button btBuscaLote;

...

@Override
public void initialize(URL location, ResourceBundle resources) {

    String style = "-fx-font-size: 42px; -fx-fill: white;";

    GlyphIcon<?> searchIcon = GlyphsBuilder.create(FontAwesomeIcon.class)
            .glyph(FontAwesomeIcons.SEARCH)
            .style(style)
            .build();

    btBuscaOrdem.graphicProperty().setValue(searchIcon);
    btBuscaLote.graphicProperty().setValue(searchIcon);

}

上面代码的链接结果

enter image description here

如何从一个节点到两个按钮使用相同的引用,以便图标转到两个按钮?

1 个答案:

答案 0 :(得分:0)

问题

正如James_D已经假设的那样:GlyphIcon是一个节点。

它是FontAwesomeFX的一部分。班级GlyphIcon延伸 JavaFX Text和Text扩展Shape,Shape扩展Node

层次

Node
|
-> Shape
       |
       -> Text
             |
             -> GlyphIcon

Node's JavaDoc中提示

  

如果程序将子节点添加到父节点(包括组,区域,   等)并且该节点已经是不同父节点或子节点的子节点   在场景的根,自动(并静默)删除节点   它的前任父母。

因此,您无法将一个 GlyphIcon实例设置为一个按钮的图形。

解决方案

您需要为每个GlyphIcon创建一个自己的实例,并使用正确的样式设置大小。

public class FXMLController implements Initializable {

  @FXML
  private Button btBuscaOrdem;

  @FXML
  private Button btBuscaLote;

  @Override
  public void initialize(URL url, ResourceBundle rb) {

    // number of buttons
    int iconsSize = 2;
    // the glyph to set
    FontAwesomeIcon glyph = FontAwesomeIcon.SEARCH;
    /*
     * the style to set, glyph have two styleable properties:
     *
     * -glyph-size
     * -glyph-name
     */
    String style = "-fx-fill: white; -glyph-size: 42px;";
    // where the icon instances will be stored;
    GlyphIcon<?>[] icons = new GlyphIcon<?>[iconsSize];
    // create instances
    for (int i = 0; i < icons.length; i++) {
      icons[i] = GlyphsBuilder.create(FontAwesomeIconView.class)
          .glyph(glyph)
          .style(style)
          .build();
    }

    btBuscaOrdem.setGraphic(icons[0]);
    btBuscaLote.setGraphic(icons[1]);

    // two possibilities to only show graphic
    btBuscaOrdem.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    btBuscaLote.setStyle("-fx-content-display: graphic-only;");
  }
}

享受按钮!