如何使用JavaFX创建一个通知气泡,类似于iPhone菜单上的通知徽章?

2eafrhcq  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(276)

我是JavaFX新手,我正在尝试创建一个类似于下图的通知徽章。

它将被用作通知计数,我希望将其放置在JavaFX按钮的角上。我的问题是我找不到支持此功能的本地解决方案。有人能推荐一种方法吗?
谢谢

gv8xihay

gv8xihay1#

像这样的东西?也许不是那么漂亮(我不是一个艺术家),但我认为它可能涵盖了解决方案。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.paint.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="${button.prefHeight}" prefWidth="${button.prefWidth}" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Button fx:id="button" layoutY="8.0" mnemonicParsing="false" text="Click " AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
      <StackPane layoutX="57.0" layoutY="-13.0" AnchorPane.rightAnchor="-10" AnchorPane.topAnchor="-10">
         <children>
            <Circle radius="10.0" stroke="BLACK" strokeType="INSIDE">
               <fill>
                  <RadialGradient centerX="0.5" centerY="0.5" radius="0.8164556962025317">
                     <stops>
                        <Stop color="#ff361beb" />
                        <Stop color="WHITE" offset="1.0" />
                     </stops>
                  </RadialGradient>
               </fill>
            </Circle>
            <Label text="5" />
         </children>
      </StackPane>
   </children>
</AnchorPane>
tzdcorbm

tzdcorbm2#

我找到了一个更简单的解决方案(使用椭圆代替圆,以更好的方式显示两位数),只需在fxml文件中的按钮后添加一个椭圆和标签,如下所示:

<Button fx:id="btnAddMarking" layoutX="640.0" layoutY="60.0" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#stopRecording" prefHeight="48.0" prefWidth="205.0" styleClass="button-remark" text="Add marking" visible="false" />
<Ellipse fx:id="elMarking" fill="#ffaa00" layoutX="841.0" layoutY="63.0" radiusX="16.0" radiusY="12.0" stroke="#ffaa00" strokeType="INSIDE" visible="false" />
<Label fx:id="lblMarking" alignment="CENTER" layoutX="829.0" layoutY="51.0" prefHeight="25.0" prefWidth="25.0" styleClass="label-white" text="42" visible="false" />

这个技巧我已经用过好几次了:JavaFX只是按照元素在fxml文件中出现的顺序在屏幕上绘制元素,所以你总是可以得到一个元素在另一个元素之上(场景构建器也能正确地显示它)。
嗯,至少在JavaFX17中是这样,因为这是我目前正在使用的。

相关问题