Чтобы достичь того, чего вы хотите, как Вы описываете, делая это, вы можете использовать controller class и привязать размер прямоугольника до размера панели:
<?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>
, а затем
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());
}
}
Вы можете изменить цвет прямоугольника в контроллере, просто позвонив border.setStroke(...);
.
Использование Rectangle
может быть не лучшим образом. Вы можете полностью опустить прямоугольник и использовать CSS для создания самой панели привязки. CSS вам нужно
-fx-background-color: red, -fx-color ;
-fx-background-insets: 0, 10 ;
Вы можете установить это непосредственно на панели якорной:
<?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>
, но это, вероятно, лучше поместить его в внешнюю таблицу стилей:
<?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>
и затем в вашем основном классе:
Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml"));
Scene scene = new Scene(root);
scene.getStylesheets().add("my-stylesheet.css");
// ...
с моим-stylesheet.css содержащий:
.root {
-fx-background-color: red, -fx-color ;
-fx-background-insets: 0, 10 ;
}
Наконец, если вы используете таблицы стилей, как это, вы можете изменить цвет границы динамически с помощью looked-up color.Измените таблицу стилей:
.root {
my-border-color: red ;
-fx-background-color: my-border-color, -fx-color ;
-fx-background-insets: 0, 10 ;
}
, а затем вы можете изменить границу в любое время по телефону
root.setStyle("my-border-color: green;")
где root
является ссылкой на панели крепления.
SSCCE
Вот полный пример с использованием последней методики:
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 (основной класс приложения):
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);
}
}
мой-stylesheet.css:
.root {
border-color: red ;
-fx-background-color: border-color, -fx-base ;
-fx-background-insets: 0, 10 ;
}
Начало:
![enter image description here](https://i.stack.imgur.com/bOUne.png)
Resize:
![enter image description here](https://i.stack.imgur.com/qFP6w.png)
Pr Кнопка ESS несколько раз:
![enter image description here](https://i.stack.imgur.com/1GRd1.png)
спасибо так много, вы решить мою проблему! Я ценю время и усилия, которые вы наложили на этот ответ, как вы стали таким экспертом в javafx и css? не могли бы вы порекомендовать мне книгу? (про javafx и css), спасибо! – TeoCB
@TeoCB Я только что узнал из JavaDocs, [учебник Oracle] (http://docs.oracle.com/javase/8/javase-clienttechnologies.htm) и форумов, хотя у меня было довольно много Java и UI dev опыт, прежде чем я начал на JavaFX. –