我有一个javafx.scene.control.TableView
,其中包含一些javafx.scene.control.TableColumn
,其中包含一些javafx.scene.control.TextField
。 TextFields
中的某些应该具有双色背景:对角分割,左上半部分为一种颜色,右下半部分为另一种颜色。类似于https://de.wikipedia.org/wiki/Periodensystem#/media/Datei:Periodensystem_deutsch_-_neue_Farben.svg中Ge,Sb和Po的单元格。如果没有背景图片,这可能吗?
编辑:添加了一些代码。为简单起见,我省略了周围的表格,现在使用javafx.scene.text.Text
代替javafx.scene.control.TextField
。接下来的基本设置为StackPane
(作为开始)提供了统一的背景。
public class DividedBackgroundDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Test: Diagonally divided colour background");
Text txt = new Text("Text");
txt.setFont(Font.font("Arial", FontWeight.BOLD, FontPosture.REGULAR, 50));
StackPane root = new StackPane();
root.getChildren().add(txt);
root.setStyle("-fx-background-color: blue;");
primaryStage.setScene(new Scene(root, 200, 200));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
稍后,当我将使用Text
的13x13网格时,我将必须将每个Text
嵌入到其自己的StackPane
或{{ 1}},以便能够为每个Region
提供单独彩色的背景。并且其中一些Text
(尤其是本例中的一个)应该具有双色背景,两种颜色都由左下角到右上角的线划分。
简单的解决方案是提供背景图像。生产一个不是很困难。但是,然后,我必须为每种颜色生成新的背景图像。我希望有一个更灵活的解决方案。
我发现的所有属性设置器和CSS属性都提供一种单色背景。但是有时候我需要双色。
如果其他所有方法均失败,则建议的Text
是可以接受的。我希望两种颜色之间都有清晰的边框,而不是渐变。
答案 0 :(得分:1)
好吧,至少在简化问题上,我找到了解决方案。感谢@kleopatra。作为路径,我使用了javafx.scene.shape.Polygon and filled it with the appropriate colour. Using a
StackPane`,注意z坐标很重要。背景自然位于底部,填充的折线作为窗格中的第一内容,文本位于顶部。
public class DividedBackgroundDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Test: Diagonally divided colour background");
Text txt = new Text("Text");
txt.setFont(Font.font("Arial", FontWeight.BOLD, FontPosture.REGULAR, 50));
Polygon triangle = new Polygon();
triangle.getPoints().addAll(new Double[] { 0.0, 0.0, 200.0, 0.0, 0.0, 200.0 });
triangle.setFill(Color.YELLOW);
StackPane root = new StackPane();
root.getChildren().add(triangle);
root.getChildren().add(txt);
root.setStyle("-fx-background-color: blue;");
primaryStage.setScene(new Scene(root, 200, 200));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}