Pour obtenir ce que vous voulez que la façon dont vous décrivez le faire, vous pouvez utiliser un controller class et lier la taille du rectangle à la taille de la fenêtre:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="671.0" prefWidth="644.0" fx:controller="com.mycompany.myproject.Controller" fx:id="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
<children>
<Rectangle fx:id="border" fill="#ffffff00" height="671.0" layoutX="91.0" layoutY="69.0" stroke="RED" strokeType="INSIDE" strokeWidth="10.0" width="644.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
puis
package com.mycompany.myproject ;
import javafx.fxml.FXML ;
import javafx.scene.shape.Rectangle ;
import javafx.scene.layout.AnchorPane ;
public class Controller {
@FXML
private AnchorPane root ;
@FXML
private Rectangle border ;
public void initialize() {
border.widthProperty().bind(root.widthProperty());
border.heightProperty().bind(border.heightProperty());
}
}
Vous pouvez changer la couleur du rectangle dans le contrôleur simplement en appelant border.setStroke(...);
.
L'utilisation d'un Rectangle
n'est peut-être pas la meilleure solution. Vous pouvez omettre entièrement le rectangle et utiliser CSS pour styliser le volet d'ancrage lui-même. Le CSS dont vous avez besoin est
-fx-background-color: red, -fx-color ;
-fx-background-insets: 0, 10 ;
Vous pouvez définir ce directement sur le volet d'ancrage:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="671.0" prefWidth="644.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8"
style="-fx-background-color: red, -fx-color ; -fx-background-insets: 0, 10 ;">
</AnchorPane>
mais il est sans doute préférable de le mettre dans une feuille de style externe:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="671.0" prefWidth="644.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
</AnchorPane>
et puis dans votre classe principale:
Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml"));
Scene scene = new Scene(root);
scene.getStylesheets().add("my-stylesheet.css");
// ...
avec mon-stylesheet.css contenant:
.root {
-fx-background-color: red, -fx-color ;
-fx-background-insets: 0, 10 ;
}
Enfin, si vous utilisez une feuille de style comme celui-ci, vous pouvez changer la couleur de bordure dynamique à l'aide d'un looked-up color.Modifier la feuille de style:
.root {
my-border-color: red ;
-fx-background-color: my-border-color, -fx-color ;
-fx-background-insets: 0, 10 ;
}
et vous pouvez changer la frontière à tout moment en appelant
root.setStyle("my-border-color: green;")
où root
est une référence dans le volet d'ancrage.
SSCCE
Voici un exemple complet utilisant la dernière technique:
DynamicBorderColor.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.Button?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller" fx:id="root" minWidth="600" minHeight="600">
<Button text="Change Color" onAction="#changeColor" AnchorPane.topAnchor="20" AnchorPane.leftAnchor="20"/>
</AnchorPane>
Controller.java:
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
public class Controller {
private int colorIndex ;
private String[] colors = {"red", "orange", "yellow", "green", "blue", "indigo", "violet"} ;
@FXML
private AnchorPane root ;
@FXML
private void changeColor() {
colorIndex = (colorIndex + 1) % colors.length ;
root.setStyle("border-color: "+colors[colorIndex]+";");
}
}
DynamicBorderColor.java (classe d'application principale):
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class DynamicBorderColor extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Scene scene = new Scene(FXMLLoader.load(getClass().getResource("DynamicBorderColor.fxml")));
scene.getStylesheets().add("my-stylesheet.css");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
my-stylesheet.css:
.root {
border-color: red ;
-fx-background-color: border-color, -fx-base ;
-fx-background-insets: 0, 10 ;
}
Début:
Redimensionner:
Pr ess touche plusieurs fois:
merci beaucoup, vous avez résolu mon problème! J'apprécie le temps et l'effort que vous avez mis sur cette réponse, comment êtes-vous devenu si expert dans javafx et css? pourriez-vous me recommander un livre? (A propos de javafx et css), merci! – TeoCB
@TeoCB Je viens d'apprendre des JavaDocs, [Oracle tutorial] (http://docs.oracle.com/javase/8/javase-clienttechnologies.htm), et des forums, même si j'avais beaucoup de Java et d'UI expérience avant de commencer sur JavaFX. –