objectMap = new HashMap<>();
35 |
36 | /**
37 | * Used by Builder class to add a {@code javafx.scene.control.Menu}
38 | * object into FXTrayIcon, maintaining the order in which it is added
39 | * within the build sentence.
40 | * @param menu a {@code javafx.scene.control.Menu} object
41 | */
42 | static void addMenu(Menu menu) {
43 | objectMap.put(index, new MenuObject(menu));
44 | index++;
45 | }
46 |
47 | /**
48 | * Used by Builder class to add a {@code javafx.scene.control.MenuItem}
49 | * object into FXTrayIcon, maintaining the order in which it is added
50 | * within the build sentence.
51 | * @param menuItem a {@code javafx.scene.control.MenuItem} object
52 | */
53 | static void addMenuItem(MenuItem menuItem) {
54 | objectMap.put(index, new MenuObject(menuItem));
55 | index++;
56 | }
57 |
58 | /**
59 | * Used by Builder class to add many {@code javafx.scene.control.MenuItem}
60 | * objects into FXTrayIcon, maintaining the order in which it is added
61 | * within the build sentence.
62 | * @param menuItems an array of {@code javafx.scene.control.MenuItem} objects
63 | */
64 | static void addMenuItems(MenuItem... menuItems) {
65 | for(MenuItem menuItem : menuItems) {
66 | addMenuItem(menuItem);
67 | }
68 | }
69 |
70 | /**
71 | * Used by Builder class to add a separator object to FXTrayIcon while
72 | * maintaining the order in which the separator was added in the build sentence.
73 | */
74 | static void addSeparator() {
75 | objectMap.put(index, new MenuObject());
76 | index++;
77 | }
78 |
79 | /**
80 | * Used by the Builder class to get the number of objects that were
81 | * passed via the build sentence. Used for iteration to extract each
82 | * object then add it into FXTrayIcon after instantiation.
83 | */
84 | static Integer getItemCount() {
85 | return index; //since current index value is not used, this number is accurate
86 | }
87 |
88 | /**
89 | * Used by the Builder class during iteration of the objects that are
90 | * stored in this class.
91 | * @param index an Integer
92 | */
93 | static Menu getMenu(Integer index) {
94 | return objectMap.get(index).getMenu();
95 | }
96 |
97 | /**
98 | * Used by the Builder class during iteration of the objects that are
99 | * stored in this class.
100 | * @param index an Integer
101 | */
102 | static MenuItem getMenuItem(Integer index) {
103 | return objectMap.get(index).getMenuItem();
104 | }
105 |
106 | /**
107 | * Used by the Builder class during iteration of the objects that are
108 | * stored in this class.
109 | * @param index an Integer
110 | */
111 | static ItemType getItemType(Integer index) {
112 | return objectMap.get(index).getItemType();
113 | }
114 |
115 | /**
116 | * This is a pseudo record class that is used by class
117 | * BuildOrderUtil in a Map, so that the objects that are passed
118 | * to Builder in the build sentence can have their serial
119 | * order maintained.
120 | */
121 | private static class MenuObject {
122 |
123 | private Menu menu;
124 | private MenuItem menuItem;
125 | private final ItemType itemType;
126 |
127 | /**
128 | * class constructor that only accepts a {@code javafx.scene.control.Menu} object
129 | * @param menu a {@code javafx.scene.control.Menu} object
130 | */
131 | MenuObject(Menu menu) {
132 | this.menu = menu;
133 | this.itemType = ItemType.MENU;
134 | }
135 |
136 | /**
137 | * class constructor that only accepts a {@code javafx.scene.control.MenuItem} object
138 | * @param menuItem a {@code javafx.scene.control.MenuItem} object
139 | */
140 | MenuObject(MenuItem menuItem) {
141 | this.menuItem = menuItem;
142 | this.itemType = ItemType.MENU_ITEM;
143 | }
144 |
145 | /**
146 | * Default class constructor, used to track when the Builder build sentence
147 | * had a separator passed into the Builder class.
148 | */
149 | MenuObject() {
150 | this.itemType = ItemType.SEPARATOR;
151 | }
152 |
153 | /**
154 | * @return ItemType
155 | */
156 | ItemType getItemType() {
157 | return itemType;
158 | }
159 |
160 | /**
161 | * @return {@code javafx.scene.control.Menu} object
162 | */
163 | Menu getMenu() {
164 | return menu;
165 | }
166 |
167 | /**
168 | * @return {@code javafx.scene.control.MenuItem} object
169 | */
170 | MenuItem getMenuItem() {
171 | return menuItem;
172 | }
173 |
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/src/main/java/com/dustinredmond/fxtrayicon/IconScale.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | public class IconScale {
4 |
5 | private final int width;
6 | private final int height;
7 |
8 | public IconScale(int width, int height) {
9 | this.width = width;
10 | this.height = height;
11 | }
12 |
13 | public IconScale(int sizeWH) {
14 | this.width = sizeWH;
15 | this.height = sizeWH;
16 | }
17 |
18 | public int width() {
19 | return width;
20 | }
21 |
22 | public int height() {
23 | return height;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/com/dustinredmond/fxtrayicon/ItemType.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | enum ItemType {
26 | MENU,
27 | MENU_ITEM,
28 | SEPARATOR
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/dustinredmond/fxtrayicon/Restricted.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import java.awt.*;
26 |
27 | /**
28 | * This is a package local class
29 | */
30 | class Restricted implements RestrictedInterface {
31 |
32 | /**
33 | * This is the working instantiation of the TrayIcon object.
34 | * This is the only instantiation that will exist for any
35 | * instantiation of the FXTrayIcon class.
36 | */
37 | private final TrayIcon trayIcon;
38 |
39 | /**
40 | * Class Constructor used by FXTrayIcon class
41 | */
42 | public Restricted(Image image, String title, PopupMenu popupMenu ) {
43 | this.trayIcon = new TrayIcon(image, title, popupMenu);
44 | }
45 |
46 | /**
47 | * public getter for the trayIcon object. This method is only
48 | * obtainable through the getRestricted() method in FXTrayIcon class.
49 | */
50 | @Override
51 | public TrayIcon getTrayIcon() {
52 | return trayIcon;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/java/com/dustinredmond/fxtrayicon/RestrictedInterface.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import java.awt.*;
4 |
5 | public interface RestrictedInterface {
6 |
7 | public TrayIcon getTrayIcon();
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/dustinredmond/fxtrayicon/annotations/API.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.annotations;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import java.lang.annotation.ElementType;
26 | import java.lang.annotation.Retention;
27 | import java.lang.annotation.RetentionPolicy;
28 | import java.lang.annotation.Target;
29 |
30 | /**
31 | * Annotation to indicate public API for FXTrayIcon
32 | * This annotation is not retained at runtime, and
33 | * is only to ease developmental determination of
34 | * publicly available API.
35 | * Some IDEs allow disabling warnings for unused
36 | * methods with a certain annotation. This is the primary
37 | * purpose for this annotation.
38 | */
39 | @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR})
40 | @Retention(RetentionPolicy.SOURCE)
41 | public @interface API {
42 | /**
43 | * Optionally, describes the version in which the API was added.
44 | * @return The version in which the API was added or an empty String
45 | * if one is not provided.
46 | */
47 | @SuppressWarnings("unused") String version() default "";
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * FXTrayIcon java 9+ JPMS compatible
3 | */
4 | module com.dustinredmond.fxtrayicon{
5 | requires javafx.controls;
6 | requires java.desktop;
7 | requires javafx.swing;
8 | requires javafx.graphics;
9 |
10 |
11 | exports com.dustinredmond.fxtrayicon;
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/FXIconBlueWhite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/FXIconBlueWhite.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/FXIconBlueYellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/FXIconBlueYellow.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/FXIconGreenWhite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/FXIconGreenWhite.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/FXIconGreenYellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/FXIconGreenYellow.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/FXIconRedWhite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/FXIconRedWhite.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/FXIconRedYellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/FXIconRedYellow.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/i-Icon-Glass-Blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/i-Icon-Glass-Blue.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/i-Icon-Glass-Blue2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/i-Icon-Glass-Blue2.png
--------------------------------------------------------------------------------
/src/main/resources/com/dustinredmond/fxtrayicon/i-Icon-Glass-Green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/main/resources/com/dustinredmond/fxtrayicon/i-Icon-Glass-Green.png
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/CheckIsSupportedByPlatform.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin Redmond and contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 | public class CheckIsSupportedByPlatform {
25 | public static boolean isWindows() {
26 | return System.getProperty("os.name").startsWith("Windows");
27 | }
28 |
29 | public static boolean isMacOS() {
30 | final String os = System.getProperty("os.name");
31 | return os.contains("mac") || os.contains("darwin");
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/CheckMenu.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin Redmond and contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.scene.control.CheckMenuItem;
27 | import javafx.stage.Stage;
28 |
29 | import java.util.List;
30 |
31 | public class CheckMenu extends Application {
32 |
33 | CheckMenuItem cmuApples = new CheckMenuItem("Apples");
34 | CheckMenuItem cmuOranges = new CheckMenuItem("Oranges");
35 | CheckMenuItem cmuPears = new CheckMenuItem("Pears");
36 |
37 | @Override
38 | public void start(Stage primaryStage) {
39 | primaryStage.setTitle("Default Icon");
40 |
41 | FXTrayIcon fxti = new FXTrayIcon.Builder(primaryStage)
42 | .show()
43 | .build();
44 |
45 | cmuApples.setOnAction(e -> {
46 | List list = fxti.getCheckMenuItems();
47 | for (java.awt.CheckboxMenuItem cbmi : list) {
48 | if (!cbmi.getLabel().equals("Apples")) {
49 | cbmi.setState(false);
50 | }
51 | }
52 | });
53 |
54 | cmuOranges.setOnAction(e -> {
55 | fxti.getCheckMenuItem("Pears").setState(false);
56 | fxti.getCheckMenuItem("Apples").setState(false);
57 | });
58 |
59 | cmuPears.setOnAction(e -> {
60 | fxti.getCheckMenuItem("Oranges").setState(false);
61 | fxti.getCheckMenuItem("Apples").setState(false);
62 | });
63 |
64 | fxti.addMenuItem(cmuApples);
65 | fxti.addMenuItem(cmuOranges);
66 | fxti.addMenuItem(cmuPears);
67 | }
68 |
69 | public static void main(String[] args) {
70 | launch(args);
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/CheckMenuBuilder.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import javafx.application.Application;
4 | import javafx.stage.Stage;
5 | import java.util.List;
6 |
7 | /*
8 | * Copyright (c) 2022 Dustin Redmond and contributors
9 | *
10 | * Permission is hereby granted, free of charge, to any person obtaining a copy
11 | * of this software and associated documentation files (the "Software"), to deal
12 | * in the Software without restriction, including without limitation the rights
13 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 | * copies of the Software, and to permit persons to whom the Software is
15 | * furnished to do so, subject to the following conditions:
16 | *
17 | * The above copyright notice and this permission notice shall be included in all
18 | * copies or substantial portions of the Software.
19 | *
20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 | * SOFTWARE.
27 | */
28 |
29 | public class CheckMenuBuilder extends Application {
30 |
31 | FXTrayIcon fxti;
32 |
33 | @Override
34 | public void start(Stage primaryStage) {
35 | primaryStage.setTitle("Default Icon");
36 |
37 | fxti = new FXTrayIcon.Builder(primaryStage)
38 | .checkMenuItem("Apples", e-> checkApples())
39 | .checkMenuItem("Oranges", e-> checkOranges())
40 | .checkMenuItem("Pears", e-> checkPears())
41 | .separator()
42 | .addExitMenuItem()
43 | .show()
44 | .build();
45 |
46 | }
47 |
48 | private void checkApples() {
49 | List list = fxti.getCheckMenuItems();
50 | for (java.awt.CheckboxMenuItem cbmi : list) {
51 | if (!cbmi.getLabel().equals("Apples")) {
52 | cbmi.setState(false);
53 | }
54 | }
55 | }
56 |
57 | private void checkOranges() {
58 | fxti.getCheckMenuItem("Pears").setState(false);
59 | fxti.getCheckMenuItem("Apples").setState(false);
60 | }
61 |
62 | private void checkPears() {
63 | fxti.getCheckMenuItem("Oranges").setState(false);
64 | fxti.getCheckMenuItem("Apples").setState(false);
65 | }
66 |
67 | public static void main(String[] args) {
68 | launch(args);
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/DefaultIconTest.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import javafx.application.Application;
4 | import javafx.stage.Stage;
5 |
6 | /*
7 | * Copyright (c) 2022 Dustin Redmond and contributors
8 | *
9 | * Permission is hereby granted, free of charge, to any person obtaining a copy
10 | * of this software and associated documentation files (the "Software"), to deal
11 | * in the Software without restriction, including without limitation the rights
12 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 | * copies of the Software, and to permit persons to whom the Software is
14 | * furnished to do so, subject to the following conditions:
15 | *
16 | * The above copyright notice and this permission notice shall be included in all
17 | * copies or substantial portions of the Software.
18 | *
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 | * SOFTWARE.
26 | */
27 |
28 | public class DefaultIconTest extends Application {
29 |
30 | @Override
31 | public void start(Stage primaryStage) {
32 | primaryStage.setTitle("Default Icon");
33 |
34 | new FXTrayIcon
35 | .Builder(primaryStage)
36 | .menuItem("Option 1", e -> menu1())
37 | .menuItem("Option 2", e -> menu2())
38 | .separator()
39 | .menuItem("Exit", e -> System.exit(0))
40 | .show()
41 | .build();
42 | }
43 |
44 | private void menu1() {System.out.println("Option 1");}
45 | private void menu2() {System.out.println("Option 2");}
46 |
47 | public static void main(String[] args) {
48 | launch(args);
49 | }
50 | }
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/MultipleItemsOneLine.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import javafx.application.Application;
4 | import javafx.stage.Stage;
5 |
6 | /*
7 | * Copyright (c) 2022 Dustin Redmond and contributors
8 | *
9 | * Permission is hereby granted, free of charge, to any person obtaining a copy
10 | * of this software and associated documentation files (the "Software"), to deal
11 | * in the Software without restriction, including without limitation the rights
12 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 | * copies of the Software, and to permit persons to whom the Software is
14 | * furnished to do so, subject to the following conditions:
15 | *
16 | * The above copyright notice and this permission notice shall be included in all
17 | * copies or substantial portions of the Software.
18 | *
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 | * SOFTWARE.
26 | */
27 |
28 | public class MultipleItemsOneLine extends Application {
29 |
30 | @Override
31 | public void start(Stage primaryStage) {
32 | primaryStage.setTitle("Many From One");
33 | new FXTrayIcon
34 | .Builder(primaryStage)
35 | .menuItem("Option 1", e -> menu1())
36 | .menuItem("Option 2", e -> menu2())
37 | .separator()
38 | .menuItem("Exit", e -> System.exit(0))
39 | .show()
40 | .build();
41 | }
42 |
43 | private void menu1() {System.out.println("Option 1");}
44 | private void menu2() {System.out.println("Option 2");}
45 |
46 | public static void main(String[] args) {
47 | launch(args);
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/NestedSubMenus.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import javafx.application.Application;
4 | import javafx.application.Platform;
5 | import javafx.event.ActionEvent;
6 | import javafx.event.EventHandler;
7 | import javafx.geometry.Insets;
8 | import javafx.scene.Scene;
9 | import javafx.scene.control.Label;
10 | import javafx.scene.control.MenuItem;
11 | import javafx.scene.control.SplitPane;
12 | import javafx.scene.control.TextField;
13 | import javafx.scene.layout.VBox;
14 | import javafx.stage.Stage;
15 |
16 | /*
17 | * Copyright (c) 2022 Dustin Redmond and contributors
18 | *
19 | * Permission is hereby granted, free of charge, to any person obtaining a copy
20 | * of this software and associated documentation files (the "Software"), to deal
21 | * in the Software without restriction, including without limitation the rights
22 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23 | * copies of the Software, and to permit persons to whom the Software is
24 | * furnished to do so, subject to the following conditions:
25 | *
26 | * The above copyright notice and this permission notice shall be included in all
27 | * copies or substantial portions of the Software.
28 | *
29 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 | * SOFTWARE.
36 | */
37 |
38 | public class NestedSubMenus extends Application {
39 |
40 |
41 | private Label lblRightMessage;
42 | private Label lblLeftMessage;
43 | private TextField tfLeftMessage;
44 | private TextField tfRightMessage;
45 |
46 | @Override public void start(Stage stage) throws Exception {
47 | SplitPane splitPane;
48 | Label lblRight = new Label("Right Side");
49 | Label lblLeft = new Label("Left Side");
50 | lblRightMessage = new Label();
51 | lblLeftMessage = new Label();
52 | Label lblRightText = new Label("Type message, then use tray menu to send it to the left");
53 | Label lblLeftText = new Label("Type message, then use tray menu to send it to the right");
54 | tfLeftMessage = new TextField();
55 | tfRightMessage = new TextField();
56 | VBox vboxLeft = new VBox(10,lblLeft, tfLeftMessage, lblLeftMessage, lblLeftText);
57 | vboxLeft.setPadding(new Insets(5,15,5,15));
58 | VBox vboxRight = new VBox(10,lblRight, tfRightMessage, lblRightMessage, lblRightText);
59 | vboxRight.setPadding(new Insets(5,15,5,15));
60 | splitPane = new SplitPane(vboxLeft, vboxRight);
61 | Scene scene = new Scene(splitPane);
62 | stage.setScene(scene);
63 |
64 | new FXTrayIcon.Builder(stage)
65 | .applicationTitle("Nested Sub Menus")
66 | .addTitleItem(true)
67 | .menu("Send Right", newMenuItem("Send Text", e-> sendTextRight()), newMenuItem("Clear Text", e->clearRightMessage()))
68 | .menu("Send Left", newMenuItem("Send Text", e-> sendTextLeft()), newMenuItem("Clear Text", e->clearLeftMessage()))
69 | .addExitMenuItem()
70 | .show()
71 | .build();
72 | }
73 |
74 | private MenuItem newMenuItem(String label, EventHandler event) {
75 | MenuItem menuItem = new MenuItem(label);
76 | menuItem.setOnAction(event);
77 | return menuItem;
78 | }
79 |
80 | private void sendTextRight() {
81 | Platform.runLater(() -> lblRightMessage.setText(tfLeftMessage.getText()));
82 | }
83 |
84 | private void sendTextLeft() {
85 | Platform.runLater(() -> lblLeftMessage.setText(tfRightMessage.getText()));
86 | }
87 |
88 | private void clearRightMessage() {
89 | Platform.runLater(() -> lblRightMessage.setText(""));
90 | }
91 |
92 | private void clearLeftMessage() {
93 | Platform.runLater(() -> lblLeftMessage.setText(""));
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/RunnableTest.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.scene.Scene;
27 | import javafx.scene.control.Alert;
28 | import javafx.scene.control.Button;
29 | import javafx.scene.control.Label;
30 | import javafx.scene.control.Menu;
31 | import javafx.scene.control.MenuItem;
32 | import javafx.scene.layout.BorderPane;
33 | import javafx.scene.layout.HBox;
34 | import javafx.scene.layout.VBox;
35 | import javafx.stage.Stage;
36 | import java.net.URL;
37 |
38 |
39 | /**
40 | * A test of the FXTrayIcon functionality in the form
41 | * of a runnable JavaFX application. Compile and run this
42 | * class to test the features of FXTrayIcon.
43 | */
44 | public class RunnableTest extends Application {
45 |
46 | @Override
47 | public void start(Stage stage) {
48 |
49 | BorderPane root = new BorderPane();
50 | stage.setScene(new Scene(root));
51 |
52 | // By default, our FXTrayIcon will have an entry with our Application's title in bold font,
53 | // when clicked, this MenuItem will call stage.show()
54 | //
55 | // This can be disabled by simply removing the MenuItem after instantiating the FXTrayIcon
56 | // though, by convention, most applications implement this functionality.
57 | stage.setTitle("FXTrayIcon test!");
58 |
59 | // Instantiate the FXTrayIcon providing the parent Stage and a path to an Image file
60 | FXTrayIcon trayIcon = new FXTrayIcon(stage, getClass().getResource("FXIconRedWhite.png"));
61 | trayIcon.show();
62 |
63 | // By default the FXTrayIcon's tooltip will be the parent stage's title, that we used in the constructor
64 | // This method can override this
65 | trayIcon.setTrayIconTooltip("An alternative tooltip!");
66 |
67 | // We can now add JavaFX MenuItems to the menu
68 | MenuItem menuItemTest = new MenuItem("Create some JavaFX component!");
69 | menuItemTest.setOnAction(e ->
70 | new Alert(Alert.AlertType.INFORMATION, "We just ran some JavaFX code from an AWT MenuItem!").showAndWait());
71 | trayIcon.addMenuItem(menuItemTest);
72 |
73 | // We can also nest menus, below is an Options menu with sub-items
74 | Menu menuOptions = new Menu("Options");
75 | MenuItem miOn = new MenuItem("On");
76 | miOn.setOnAction(e -> System.out.println("Options -> On clicked"));
77 | MenuItem miOff = new MenuItem("Off");
78 | miOff.setOnAction(e -> System.out.println("Options -> Off clicked"));
79 | menuOptions.getItems().addAll(miOn, miOff);
80 | trayIcon.addMenuItem(menuOptions);
81 |
82 | VBox vBox = new VBox(5);
83 | vBox.getChildren().add(new Label("You should see a tray icon!\nTry closing this window " +
84 | "and double-clicking the icon.\n" +
85 | "Try single-clicking it."));
86 | Button buttonRemoveTrayIcon = new Button("Remove TrayIcon");
87 | vBox.getChildren().add(buttonRemoveTrayIcon);
88 |
89 | // Removing the FXTrayIcon, this will also cause the JVM to terminate
90 | // after the last JavaFX Stage is hidden
91 | buttonRemoveTrayIcon.setOnAction(e -> trayIcon.hide());
92 |
93 | Button buttonDefaultMsg = new Button("Show a \"Default\" message");
94 | // showDefaultMessage uses the FXTrayIcon image in the notification
95 | buttonDefaultMsg.setOnAction(e -> trayIcon.showMessage("A caption text", "Some content text."));
96 |
97 | Button buttonInfoMsg = new Button("Show a \"Info\" message");
98 | // other showXXX methods use an icon appropriate for the message type
99 | buttonInfoMsg.setOnAction(e -> trayIcon.showInfoMessage("A caption text", "Some content text"));
100 |
101 | Button buttonWarnMsg = new Button("Show a \"Warn\" message");
102 | buttonWarnMsg.setOnAction(e -> trayIcon.showWarningMessage("A caption text", "Some content text"));
103 |
104 | Button buttonErrorMsg = new Button("Show a \"Error\" message");
105 | buttonErrorMsg.setOnAction(e -> trayIcon.showErrorMessage("A caption text", "Some content text"));
106 |
107 | HBox hBox = new HBox(5, buttonDefaultMsg, buttonInfoMsg, buttonWarnMsg, buttonErrorMsg);
108 | vBox.getChildren().add(hBox);
109 |
110 | root.setCenter(vBox);
111 | stage.sizeToScene();
112 | stage.show();
113 | }
114 |
115 | /**
116 | * Test icon used for FXTrayIcon runnable tests
117 | *
118 | * @return URL to an example icon PNG
119 | */
120 | public URL getIcon() {
121 | return getClass().getResource("FXIconRedWhite.png");
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestAddDefaultMenuItem.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.stage.Stage;
27 |
28 | public class TestAddDefaultMenuItem extends Application {
29 |
30 | @Override
31 | public void start(Stage primaryStage) throws Exception {
32 | primaryStage.setTitle("My App");
33 |
34 | FXTrayIcon icon = new FXTrayIcon(primaryStage, getClass().getResource("FXIconRedWhite.png"));
35 | icon.addTitleItem(true);
36 | icon.addExitItem(true);
37 | icon.show();
38 | }
39 |
40 | public static void main(String[] args) {
41 | Application.launch(TestAddDefaultMenuItem.class, args);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestBareFXTrayIcon.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.stage.Stage;
27 |
28 | public class TestBareFXTrayIcon extends Application {
29 |
30 | @Override
31 | public void start(Stage stage) throws Exception {
32 | stage.setTitle("Test FXTrayIcon with empty menu");
33 | FXTrayIcon trayIcon = new FXTrayIcon(stage, getClass().getResource("FXIconRedWhite.png"));
34 | trayIcon.show();
35 | }
36 |
37 | public static void main(String[] args) {
38 | Application.launch(TestBareFXTrayIcon.class);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestBuilderClass.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.scene.Scene;
27 | import javafx.scene.control.*;
28 | import javafx.scene.layout.BorderPane;
29 | import javafx.scene.layout.HBox;
30 | import javafx.scene.layout.VBox;
31 | import javafx.stage.Stage;
32 | import java.net.URL;
33 |
34 | /**
35 | * A test of the FXTrayIcon functionality in the form
36 | * of a runnable JavaFX application. Compile and run this
37 | * class to test the features of FXTrayIcon.
38 | */
39 | public class TestBuilderClass extends Application {
40 |
41 | private FXTrayIcon trayIcon = null;
42 |
43 | @Override
44 | public void start(Stage stage) {
45 |
46 |
47 | BorderPane root = new BorderPane();
48 | stage.setScene(new Scene(root));
49 |
50 | // By default, our FXTrayIcon will have an entry with our Application's title in bold font,
51 | // when clicked, this MenuItem will call stage.show()
52 | //
53 | // This can be disabled by simply removing the MenuItem after instantiating the FXTrayIcon
54 | // though, by convention, most applications implement this functionality.
55 | stage.setTitle("FXTrayIcon Test Builder Class!");
56 | stage.setOnCloseRequest(e -> System.exit(0));
57 |
58 | // We first create the MenuItems that we want to add into FXTrayIcon
59 | MenuItem menuItemTest = new MenuItem("Create some JavaFX component!");
60 | menuItemTest.setOnAction(e -> new Alert(Alert.AlertType.INFORMATION, "We just ran some JavaFX code from an AWT MenuItem!").showAndWait());
61 | MenuItem menuExit = new MenuItem("Exit Application");
62 | menuExit.setOnAction(e -> System.exit(0));
63 |
64 |
65 | // We can also nest menus, below is an Options menu with sub-items
66 | Menu menuOptions = new Menu("Options");
67 | MenuItem miOn = new MenuItem("On");
68 | miOn.setOnAction(e -> System.out.println("Options -> On clicked"));
69 | MenuItem miOff = new MenuItem("Off");
70 | miOff.setOnAction(e -> System.out.println("Options -> Off clicked"));
71 | menuOptions.getItems().addAll(miOn, miOff);
72 |
73 | VBox vBox = new VBox(5);
74 | vBox.getChildren().add(new Label("You should see a tray icon!\nTry closing this window " +
75 | "and double-clicking the icon.\n" +
76 | "Try single-clicking it."));
77 | Button buttonRemoveTrayIcon = new Button("Remove TrayIcon");
78 | vBox.getChildren().add(buttonRemoveTrayIcon);
79 |
80 |
81 | // Removing the FXTrayIcon, this will also cause the JVM to terminate
82 | // after the last JavaFX Stage is hidden
83 | buttonRemoveTrayIcon.setOnAction(e -> trayIcon.hide());
84 |
85 | Button buttonDefaultMsg = new Button("Show a \"Default\" message");
86 | // showDefaultMessage uses the FXTrayIcon image in the notification
87 | buttonDefaultMsg.setOnAction(e -> trayIcon.showMessage("A caption text", "Some content text."));
88 |
89 | Button buttonInfoMsg = new Button("Show a \"Info\" message");
90 | // other showXXX methods use an icon appropriate for the message type
91 | buttonInfoMsg.setOnAction(e -> trayIcon.showInfoMessage("A caption text", "Some content text"));
92 |
93 | Button buttonWarnMsg = new Button("Show a \"Warn\" message");
94 | buttonWarnMsg.setOnAction(e -> trayIcon.showWarningMessage("A caption text", "Some content text"));
95 |
96 | Button buttonErrorMsg = new Button("Show a \"Error\" message");
97 | buttonErrorMsg.setOnAction(e -> trayIcon.showErrorMessage("A caption text", "Some content text"));
98 |
99 | HBox hBox = new HBox(5, buttonDefaultMsg, buttonInfoMsg, buttonWarnMsg, buttonErrorMsg);
100 | vBox.getChildren().add(hBox);
101 |
102 | root.setCenter(vBox);
103 | stage.sizeToScene();
104 | stage.show();
105 |
106 | // Once we have built our Stage and Scene, we invoke FXTrayIcons Builder class
107 | // providing it with the parent Stage and a path to an image file.
108 | // The Builder class brings everything together in a single sentence, including
109 | // all of our menus and separators.
110 |
111 | trayIcon = new FXTrayIcon.Builder(stage, getClass().getResource("FXIconRedYellow.png"))
112 | .toolTip("An alternative tooltip!")
113 | .menuItem(menuItemTest)
114 | .menuItem(menuOptions)
115 | .applicationTitle("FXTrayIcon Builder Text")
116 | .separator()
117 | .addExitMenuItem()
118 | .build();
119 |
120 | trayIcon.show();
121 | }
122 |
123 | /**
124 | * Test icon used for FXTrayIcon runnable tests
125 | *
126 | * @return URL to an example icon PNG
127 | */
128 | public URL getIcon() {
129 | return getClass().getResource("FXIconRedYellow.png");
130 | }
131 |
132 | }
133 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestFXTrayIcon.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.application.Platform;
27 | import javafx.scene.control.Label;
28 | import javafx.scene.control.MenuItem;
29 | import javafx.stage.Stage;
30 | import org.junit.Test;
31 | import java.awt.*;
32 | import static org.junit.Assert.*;
33 |
34 | /**
35 | * Serves as a basic smoke test for FXTrayIcon and associated
36 | * helper classes.
37 | */
38 | public class TestFXTrayIcon extends Application {
39 |
40 | private static final String TEST_ICON = "FXIconRedWhite.png";
41 |
42 | /**
43 | * Entry point for runnable tests.
44 | * Determines if we're running the tests in a headless
45 | * environment or an environment without desktop support
46 | * and runs the appropriate tests.
47 | */
48 | @Test
49 | public void runTestOnFXApplicationThread() {
50 | if (!Desktop.isDesktopSupported()) {
51 | System.err.println("Tests unable to be run on headless environment.");
52 | return;
53 | }
54 | if (System.getenv("CI") != null) {
55 | System.err.println("Tests unable to be run on headless CI platform.");
56 | return;
57 | }
58 | Application.launch(TestFXTrayIcon.class, (String) null);
59 | }
60 |
61 | @Override
62 | public void start(Stage stage) {
63 | testShouldConvertSuccessful();
64 | testShouldConvertFail();
65 | testTrayIconSupported();
66 | testNotNullTestResource();
67 | testInitialization();
68 | if (CheckIsSupportedByPlatform.isMacOS() || CheckIsSupportedByPlatform.isWindows()) {
69 | assertTrue(FXTrayIcon.isSupported());
70 | }
71 | Platform.exit();
72 | }
73 |
74 | /**
75 | * Test for making sure that we're able to 'convert' a
76 | * JavaFX MenuItem into an AWT MenuItem via AWTUtils.convertFromJavaFX()
77 | */
78 | @Test public void testShouldConvertSuccessful() {
79 | MenuItem fxItem = new MenuItem("SomeText");
80 | fxItem.setDisable(true);
81 | fxItem.setOnAction(e -> {/* ignored */});
82 |
83 | java.awt.MenuItem awtItem = AWTUtils.convertFromJavaFX(fxItem);
84 | assertEquals(fxItem.getText(), awtItem.getLabel());
85 | assertEquals(fxItem.isDisable(), !awtItem.isEnabled());
86 | assertEquals(1, awtItem.getActionListeners().length);
87 | }
88 |
89 | /**
90 | * Test that an Exception is thrown when AWTUtils cannot
91 | * translate and AWT MenuItem behavior over to JavaFX MenuItem
92 | */
93 | @Test public void testShouldConvertFail() {
94 | MenuItem fxItem = new MenuItem();
95 | fxItem.setGraphic(new Label());
96 | try {
97 | //noinspection unused
98 | java.awt.MenuItem awtItem = AWTUtils.convertFromJavaFX(fxItem);
99 | fail("Should not be able to assign graphic in AWTUtils");
100 | } catch (Exception ignored) { /* should always reach here */ }
101 | }
102 |
103 | /**
104 | * Sanity test to make sure that FXTrayIcon.isSupported() does not
105 | * give a different result than java.awt.SystemTray.isSupported()
106 | */
107 | @Test public void testTrayIconSupported() {
108 | assertEquals(SystemTray.isSupported(), FXTrayIcon.isSupported());
109 | }
110 |
111 | /**
112 | * Make sure that our test icon is not null. If this fails, other
113 | * tests will not run successfully.
114 | */
115 | @Test public void testNotNullTestResource() {
116 | try {
117 | assertNotNull(getClass().getResource(TEST_ICON));
118 | } catch (Exception e) {
119 | fail("Error retrieving resources (FXTrayIcon graphic) for unit tests");
120 | }
121 | }
122 |
123 | /**
124 | * Stupid sanity test, if this fails for any reason, we have issues.
125 | */
126 | @Test public void testInitialization() {
127 | if (FXTrayIcon.isSupported()) {
128 | FXTrayIcon icon = new FXTrayIcon(new Stage(), getClass().getResource(TEST_ICON));
129 | assertNotNull(icon);
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestRestrictedAccess.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import javafx.application.Application;
4 | import javafx.application.Platform;
5 | import javafx.geometry.Pos;
6 | import javafx.scene.Scene;
7 | import javafx.scene.control.Label;
8 | import javafx.scene.layout.VBox;
9 | import javafx.stage.Stage;
10 |
11 | import java.awt.event.MouseEvent;
12 | import java.awt.event.MouseListener;
13 | import java.net.URL;
14 |
15 | public class TestRestrictedAccess extends Application {
16 |
17 | public static void main(String[] args) {
18 | launch(args);
19 | }
20 |
21 | @Override public void start(Stage primaryStage) throws Exception {
22 | createScene(primaryStage);
23 | FXTrayIcon icon = new FXTrayIcon.Builder(primaryStage,getIcon(),24,24)
24 | .menuItem("This does nothing", e->{})
25 | .separator()
26 | .addExitMenuItem("Exit")
27 | .show()
28 | .build();
29 |
30 | /**
31 | * This accesses the restricted trayIcon object and adds a right click
32 | * event listener, which when clicked, shows the stage.
33 | */
34 | icon.getRestricted().getTrayIcon().addMouseListener(new MouseListener() {
35 |
36 | /**
37 | * This event is fired when the mouse is clicked on the tray icon
38 | * @param - MouseEvent
39 | */
40 | @Override public void mouseClicked(MouseEvent e) {
41 | if(e.getButton() == 3) {
42 | Platform.runLater(() -> {
43 | primaryStage.show();
44 | });
45 | }
46 | }
47 |
48 | /**
49 | * Ignored
50 | * @param - MouseEvent
51 | */
52 | @Override public void mousePressed(MouseEvent ignored) {
53 |
54 | }
55 |
56 | /**
57 | * Ignored
58 | * @param - MouseEvent
59 | */
60 | @Override public void mouseReleased(MouseEvent ignored) {
61 |
62 | }
63 |
64 | /**
65 | * Ignored
66 | * @param - MouseEvent
67 | */
68 | @Override public void mouseEntered(MouseEvent ignored) {
69 |
70 | }
71 |
72 | /**
73 | * Ignored
74 | * @param - MouseEvent
75 | */
76 | @Override public void mouseExited(MouseEvent ignored) {
77 |
78 | }
79 | });
80 | }
81 |
82 | private void createScene(Stage stage) {
83 | Label label = new Label("Right clicking works!");
84 | label.setPrefSize(150,55);
85 | label.setAlignment(Pos.CENTER);
86 | VBox box = new VBox(label);
87 | scene = new Scene(box);
88 | stage.setScene(scene);
89 | }
90 |
91 | Scene scene;
92 |
93 | private URL getIcon() {
94 | return getClass().getResource("FXIconRedYellow.png");
95 | }
96 |
97 | }
98 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestSwitchIconsOnTheFly.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | /*
4 | * Copyright (c) 2022 Dustin K. Redmond & contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 | import javafx.collections.FXCollections;
27 | import javafx.collections.ObservableList;
28 | import javafx.scene.Node;
29 | import javafx.scene.Scene;
30 | import javafx.scene.control.Button;
31 | import javafx.scene.control.ChoiceBox;
32 | import javafx.scene.control.Label;
33 | import javafx.scene.control.MenuItem;
34 | import javafx.scene.image.Image;
35 | import javafx.scene.image.ImageView;
36 | import javafx.scene.layout.AnchorPane;
37 | import javafx.scene.layout.HBox;
38 | import javafx.scene.layout.VBox;
39 | import javafx.stage.Stage;
40 | import java.net.URL;
41 | import java.util.Arrays;
42 | import java.util.Random;
43 |
44 | import static javafx.scene.layout.AnchorPane.*;
45 |
46 | public class TestSwitchIconsOnTheFly extends Application {
47 |
48 | AnchorPane root;
49 |
50 | private final String fileName1 = "FXIconRedWhite.png";
51 | private final String fileName2 = "FXIconRedYellow.png";
52 | private final String fileName3 = "FXIconBlueWhite.png";
53 | private final String fileName4 = "FXIconBlueYellow.png";
54 | private final String fileName5 = "FXIconGreenWhite.png";
55 | private final String fileName6 = "FXIconGreenYellow.png";
56 | private final String fileName7 = "i-Icon-Glass-Blue2.png";
57 | private final String fileName8 = "i-Icon-Glass-Green.png";
58 |
59 | URL icon1 = getClass().getResource(fileName1);
60 | URL icon2 = getClass().getResource(fileName2);
61 | URL icon3 = getClass().getResource(fileName3);
62 | URL icon4 = getClass().getResource(fileName4);
63 | URL icon5 = getClass().getResource(fileName5);
64 | URL icon6 = getClass().getResource(fileName6);
65 | URL icon7 = getClass().getResource(fileName7);
66 | URL icon8 = getClass().getResource(fileName8);
67 |
68 | private final String name1 = "Red-White";
69 | private final String name2 = "Red-Yellow";
70 | private final String name3 = "Blue-White";
71 | private final String name4 = "Blue-Yellow";
72 | private final String name5 = "Green-White";
73 | private final String name6 = "Green-Yellow";
74 | private final String name7 = "Blue-Glass";
75 | private final String name8 = "Green-Glass";
76 |
77 | private FXTrayIcon trayIcon = null;
78 | private final URL[] imageURLs = new URL[]{icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8};
79 | private final ObservableList nameList = FXCollections.observableArrayList(Arrays.asList(name1, name2, name3, name4, name5, name6, name7, name8));
80 | public final String style1 = "-fx-background-color: radial-gradient(radius 180%, orange, derive(darkred, -30%), derive(yellow, 30%));";
81 | public final String style2 = "-fx-background-color: radial-gradient(radius 180%, pink, derive(purple, -30%), derive(purple, 30%));";
82 | public final String style3 = "-fx-background-color: radial-gradient(radius 180%, yellow, derive(darkorange, -30%), derive(lightsalmon, 30%));";
83 |
84 | private ImageView iView;
85 |
86 | private void choseRandomIcon() {
87 | Random random = new Random();
88 | changeIcon(imageURLs[random.nextInt(6)]);
89 | }
90 |
91 | @Override public void start(Stage stage) {
92 | root = new AnchorPane();
93 | root.setStyle(style3);
94 | stage.setWidth(650);
95 | stage.setHeight(450);
96 |
97 | //Windows likes 16 x 16 icons
98 |
99 | stage.setScene(new Scene(root));
100 |
101 | // By default, our FXTrayIcon will have an entry with our Application's title in bold font,
102 | // when clicked, this MenuItem will call stage.show()
103 | //
104 | // This can be disabled by simply removing the MenuItem after instantiating the FXTrayIcon
105 | // though, by convention, most applications implement this functionality.
106 | stage.setTitle("FXTrayIcon Switch Icons On The Fly Test");
107 |
108 | // Instantiate the FXTrayIcon providing the parent Stage and a path to an Image file
109 | MenuItem menuRandom = new MenuItem("Random Icon");
110 | MenuItem menuExit = new MenuItem("Exit Application");
111 | menuRandom.setOnAction(e->choseRandomIcon());
112 | menuExit.setOnAction(e-> System.exit(0));
113 |
114 | // With the Builder class, we can quickly create our FXTrayIcon Menu
115 | trayIcon = new FXTrayIcon.Builder(stage).menuItem("Exit",e-> System.exit(0)).show().build();
116 |
117 | ChoiceBox iconChoiceBox = new ChoiceBox<>(nameList);
118 | iconChoiceBox.setOnAction(e-> newIconChoice(iconChoiceBox.getValue()));
119 |
120 | // We can also nest menus, below is an Options' menu with sub-items
121 | VBox vBox = new VBox(5);
122 | Label lblChoose = new Label("Chose an Icon");
123 | iView = new ImageView();
124 | iView.setPreserveRatio(true);
125 | //setNodePosition(getNode(root,iView),10,10,50,50);
126 | setNodePosition(getNode(root,lblChoose),10,-1,12.5,-1);
127 | setNodePosition(getNode(root,iconChoiceBox),95,-1,10,-1);
128 |
129 |
130 | Button buttonDefaultMsg = new Button("Show a \"Default\" message");
131 |
132 | // showDefaultMessage uses the FXTrayIcon image in the notification
133 | buttonDefaultMsg.setOnAction(e -> trayIcon.showMessage("A caption text", "Some content text."));
134 |
135 | Button buttonInfoMsg = new Button("Show a \"Info\" message");
136 | // other showXXX methods use an icon appropriate for the message type
137 | buttonInfoMsg.setOnAction(e -> trayIcon.showInfoMessage("A caption text", "Some content text"));
138 |
139 | Button buttonWarnMsg = new Button("Show a \"Warn\" message");
140 | buttonWarnMsg.setOnAction(e -> trayIcon.showWarningMessage("A caption text", "Some content text"));
141 |
142 | Button buttonErrorMsg = new Button("Show a \"Error\" message");
143 | buttonErrorMsg.setOnAction(e -> trayIcon.showErrorMessage("A caption text", "Some content text"));
144 |
145 | HBox hBox = new HBox(5, buttonDefaultMsg, buttonInfoMsg, buttonWarnMsg, buttonErrorMsg);
146 | vBox.getChildren().addAll(iView,hBox);
147 | setNodePosition(getNode(root,vBox),10,10,-1,10);
148 | stage.show();
149 | }
150 |
151 | private void changeIcon(URL iconURL) {
152 | Image image = new Image(iconURL.toExternalForm());
153 | iView.setImage(image);
154 | iView.setPreserveRatio(true);
155 | double height = iView.getScene().getWindow().getHeight();
156 | //iView.setFitWidth(w - (w * .25));
157 | iView.setFitHeight(height - (height * .25));
158 | trayIcon.setGraphic(image);
159 | }
160 |
161 | private void newIconChoice(String iconName) {
162 | int index;
163 | switch(iconName) {
164 | case name2:
165 | index = 1;
166 | root.setStyle(style1);
167 | break;
168 |
169 | case name3:
170 | index = 2;
171 | root.setStyle(style1);
172 | break;
173 |
174 | case name4:
175 | index = 3;
176 | root.setStyle(style2);
177 | break;
178 |
179 | case name5:
180 | index = 4;
181 | root.setStyle(style3);
182 | break;
183 |
184 | case name6:
185 | index = 5;
186 | root.setStyle(style3);
187 | break;
188 |
189 | case name7:
190 | index = 6;
191 | root.setStyle(style2);
192 | break;
193 |
194 | case name8:
195 | index = 7;
196 | root.setStyle(style3);
197 | break;
198 |
199 | default:
200 | index = 0;
201 | root.setStyle(style1);
202 | break;
203 | }
204 | System.out.println(index);
205 | changeIcon(imageURLs[index]);
206 | }
207 |
208 | private Node getNode(AnchorPane root, VBox control) {
209 | root.getChildren().add(control);
210 | return root.getChildren().get(root.getChildren().indexOf(control));
211 | }
212 |
213 | private Node getNode(AnchorPane root, Label control) {
214 | root.getChildren().add(control);
215 | return root.getChildren().get(root.getChildren().indexOf(control));
216 | }
217 |
218 | private Node getNode(AnchorPane root, ChoiceBox control) {
219 | root.getChildren().add(control);
220 | return root.getChildren().get(root.getChildren().indexOf(control));
221 | }
222 |
223 | private void setNodePosition(Node node, double left, double right, double top, double bottom) {
224 | if (top != -1) setTopAnchor(node, top);
225 | if (bottom != -1) setBottomAnchor(node, bottom);
226 | if (left != -1) setLeftAnchor(node, left);
227 | if (right != -1) setRightAnchor(node, right);
228 | }
229 | }
230 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/TestTextChangeInFXItem.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon;
2 |
3 | import javafx.application.Application;
4 | import javafx.scene.control.MenuItem;
5 | import javafx.stage.Stage;
6 |
7 | public class TestTextChangeInFXItem extends Application {
8 |
9 | @Override
10 | public void start(Stage primaryStage) throws Exception {
11 | FXTrayIcon icon = new FXTrayIcon(primaryStage);
12 | MenuItem item = new MenuItem("Change Me");
13 | icon.addMenuItem(item);
14 | icon.show();
15 | item.setText("Changed");
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/animation/Animation.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.animation;
2 |
3 | import com.dustinredmond.fxtrayicon.FXTrayIcon;
4 | import com.sun.javafx.iio.ImageLoader;
5 | import javafx.application.Application;
6 | import javafx.geometry.Insets;
7 | import javafx.geometry.Pos;
8 | import javafx.scene.Scene;
9 | import javafx.scene.control.Button;
10 | import javafx.scene.image.Image;
11 | import javafx.scene.layout.HBox;
12 | import javafx.scene.layout.VBox;
13 | import javafx.stage.Stage;
14 |
15 | import java.io.File;
16 | import java.net.MalformedURLException;
17 | import java.net.URL;
18 | import java.util.LinkedList;
19 |
20 | public class Animation extends Application {
21 |
22 | private FXTrayIcon fxTrayIcon;
23 | private String filePath = "com/dustinredmond/fxtrayicon/animate/%s/%s.png";
24 | private String iconPath = "com/dustinredmond/fxtrayicon/animate/%s/Tray.png";
25 | private Button btnOne;
26 | private Button btnTwo;
27 | private Button btnThree;
28 | private Button btnStart;
29 | private Button btnStop;
30 | private Button btnPause;
31 | private Button btnReset;
32 | private Scene scene;
33 | private HBox boxButtons;
34 |
35 | private LinkedList animationFiles(int max, String folder) {
36 | LinkedList fileImages = new LinkedList<>();
37 | for (int x = 1; x <= max; x++) {
38 | try {
39 | String fileNumber = (x < 10) ? "0" + x : String.valueOf(x);
40 | File file = getResourceFile(String.format(filePath, folder, fileNumber));
41 | Image image = new Image(file.toURI().toURL().toString());
42 | fileImages.addLast(file);
43 | }
44 | catch (MalformedURLException e) {
45 | throw new RuntimeException(e);
46 | }
47 | }
48 | return fileImages;
49 | }
50 |
51 | private LinkedList animationImages(int max, String folder) {
52 | LinkedList fxImages = new LinkedList<>();
53 | for (int x = 1; x <= max; x++) {
54 | try {
55 | String fileNumber = (x < 10) ? "0" + x : String.valueOf(x);
56 | File file = getResourceFile(String.format(filePath, folder, fileNumber));
57 | Image image = new Image(file.toURI().toURL().toString());
58 | fxImages.addLast(image);
59 | }
60 | catch (MalformedURLException e) {
61 | throw new RuntimeException(e);
62 | }
63 | }
64 | return fxImages;
65 | }
66 |
67 | @Override
68 | public void start(Stage primaryStage) {
69 | primaryStage.setTitle("Animation");
70 | this.primaryStage = primaryStage;
71 | makeForm();
72 | }
73 |
74 | public static void main(String[] args) {
75 | launch(args);
76 | }
77 |
78 | private Stage primaryStage;
79 |
80 | private void makeForm() {
81 | btnOne = new Button("Example One (White)");
82 | btnTwo = new Button("Example Two (Black)");
83 | btnThree = new Button("Example Three (Different)");
84 | btnOne.setPrefWidth(200);
85 | btnTwo.setPrefWidth(200);
86 | btnThree.setPrefWidth(200);
87 | btnOne.setOnAction(e -> startOne());
88 | btnTwo.setOnAction(e -> startTwo());
89 | btnThree.setOnAction(e -> startThree());
90 | btnStart = new Button("Start");
91 | btnStop = new Button("Stop");
92 | btnPause = new Button("Pause");
93 | btnReset = new Button("Reset Icon");
94 | btnStart.setOnAction(e -> startAnimation());
95 | btnStop.setOnAction(e -> stopAnimation());
96 | btnPause.setOnAction(e -> pauseAnimation());
97 | btnReset.setOnAction(e -> setDefaultIcon());
98 | btnStart.setPrefWidth(55);
99 | btnStop.setPrefWidth(55);
100 | btnPause.setPrefWidth(55);
101 | btnReset.setPrefWidth(95);
102 | boxButtons = new HBox(15, btnStart, btnStop, btnPause, btnReset);
103 | boxButtons.setAlignment(Pos.CENTER);
104 | VBox vbox = new VBox(15, btnOne, btnTwo, btnThree, boxButtons);
105 | vbox.setPadding(new Insets(25));
106 | vbox.setAlignment(Pos.CENTER);
107 | scene = new Scene(vbox);
108 | primaryStage.setScene(scene);
109 | primaryStage.show();
110 | }
111 |
112 | private void startOne() {
113 | File icon = getResourceFile(String.format(iconPath, "One"));
114 | LinkedList fileList = animationImages(48, "One");
115 | if (fxTrayIcon == null) {
116 | startTrayIcon(fileList, icon, 100);
117 | }
118 | else {
119 | fxTrayIcon.stop();
120 | fxTrayIcon.newAnimation(fileList, 100);
121 | fxTrayIcon.setGraphic(icon, 24, 24);
122 | }
123 | }
124 |
125 | private void startTwo() {
126 | File icon = getResourceFile(String.format(iconPath, "Two"));
127 | LinkedList fileList = animationImages(48, "Two");
128 | if (fxTrayIcon == null) {
129 | startTrayIcon(fileList, icon, 100);
130 | }
131 | else {
132 | fxTrayIcon.stop();
133 | fxTrayIcon.newAnimation(fileList, 100);
134 | fxTrayIcon.setGraphic(icon, 24, 24);
135 | }
136 | }
137 |
138 | private void startThree() {
139 | File icon = getResourceFile(String.format(iconPath, "Three"));
140 | LinkedList fileList = animationImages(41, "Three");
141 | if (fxTrayIcon == null) {
142 | startTrayIcon(fileList, icon, 150);
143 | }
144 | else {
145 | fxTrayIcon.stop();
146 | fxTrayIcon.newAnimation(fileList, 150);
147 | if (icon.exists())
148 | fxTrayIcon.setGraphic(icon, 24, 24);
149 | else {
150 | System.out.println("File does not exist");
151 | }
152 | }
153 | }
154 |
155 |
156 | private void startTrayIcon(LinkedList fileList, File icon, int frameRate, boolean sortList) {
157 | fxTrayIcon = new FXTrayIcon.Builder(primaryStage, icon)
158 | .animate(fileList, frameRate, sortList)
159 | .menuItem("Start", e -> startAnimation())
160 | .menuItem("Stop", e -> stopAnimation())
161 | .separator()
162 | .addExitMenuItem()
163 | .show()
164 | .build();
165 | }
166 |
167 | private void startTrayIcon(LinkedList imageList, File icon, int frameRate) {
168 | fxTrayIcon = new FXTrayIcon.Builder(primaryStage, icon)
169 | .animate(imageList, frameRate)
170 | .menuItem("Start", e -> startAnimation())
171 | .menuItem("Stop", e -> stopAnimation())
172 | .separator()
173 | .addExitMenuItem()
174 | .show()
175 | .build();
176 | }
177 |
178 | private void startAnimation() {
179 | if (fxTrayIcon != null) {
180 | fxTrayIcon.playFromStart();
181 | }
182 | }
183 |
184 | private void stopAnimation() {
185 | if (fxTrayIcon != null) {
186 | fxTrayIcon.stop();
187 | }
188 | }
189 |
190 | private void pauseAnimation() {
191 | if (fxTrayIcon != null) {
192 | fxTrayIcon.pause();
193 | }
194 | }
195 |
196 | private void setDefaultIcon() {
197 | if (fxTrayIcon != null) {
198 | fxTrayIcon.resetIcon();
199 | }
200 | }
201 |
202 | private File getResourceFile(String resourcePath) {
203 | ClassLoader classLoader = ImageLoader.class.getClassLoader();
204 | URL resourceUrl = classLoader.getResource(resourcePath);
205 |
206 | if (resourceUrl != null) {
207 | return new File(resourceUrl.getFile());
208 | }
209 | else {
210 | throw new IllegalArgumentException("Resource not found: " + resourcePath);
211 | }
212 | }
213 | }
214 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/animation/Launcher.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.animation;
2 |
3 | import java.awt.*;
4 |
5 | public class Launcher {
6 |
7 | public static void main(String[] args) {
8 | System.setProperty("apple.awt.UIElement", "false");
9 | Toolkit.getDefaultToolkit();
10 | Animation.main(args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/issue71/AddMenuItem.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.issue71;
2 |
3 | import com.dustinredmond.fxtrayicon.FXTrayIcon;
4 | import javafx.application.Application;
5 | import javafx.geometry.Insets;
6 | import javafx.geometry.Pos;
7 | import javafx.scene.Scene;
8 | import javafx.scene.control.Button;
9 | import javafx.scene.control.Label;
10 | import javafx.scene.control.MenuItem;
11 | import javafx.scene.control.TextField;
12 | import javafx.scene.layout.VBox;
13 | import javafx.stage.Stage;
14 |
15 | /**
16 | * This test class is meant to illustrate that the problem from
17 | * Issue #71 has been fixed.
18 | */
19 |
20 |
21 | public class AddMenuItem extends Application {
22 |
23 | private FXTrayIcon fxTrayIcon;
24 | private Label lblAfter;
25 |
26 |
27 | @Override
28 | public void start(Stage primaryStage) throws Exception {
29 | fxTrayIcon = new FXTrayIcon
30 | .Builder(primaryStage)
31 | .build();
32 | show();
33 | }
34 |
35 | public static void main(String[] args) {
36 | launch(args);
37 | }
38 |
39 | private void show() {
40 | fxTrayIcon.show();
41 | fxTrayIcon.addExitItem("Exit");
42 | Stage stage = new Stage();
43 | double width = 300;
44 | double height = 225;
45 | Button btnAdd = new Button("Add");
46 | Button btnClose = new Button("Close");
47 | Label lblTitle = new Label("Type in a MenuItem name then press Add");
48 | TextField tfName = new TextField();
49 | lblAfter = new Label();
50 | lblAfter.setPrefWidth(225);
51 | tfName.setPrefWidth(150);
52 | VBox vBox = new VBox(10, lblTitle, tfName, btnAdd, lblAfter, btnClose);
53 | btnAdd.setOnAction(e->{
54 | addMenuItem(tfName.getText());
55 | lblAfter.setText("Now try the " + tfName.getText() + " menu item");
56 | });
57 | vBox.setPadding(new Insets(20));
58 | vBox.setAlignment(Pos.CENTER);
59 | Scene scene = new Scene(vBox, width, height);
60 | stage.setScene(scene);
61 | stage.show();
62 | btnClose.setOnAction(e->System.exit(0));
63 | }
64 |
65 | private void addMenuItem(String menuName) {
66 | MenuItem menuItem = new MenuItem(menuName);
67 | menuItem.setOnAction(e-> {
68 | show(menuName);
69 | lblAfter.setText("");
70 | });
71 | fxTrayIcon.addMenuItem(menuItem);
72 | }
73 |
74 | private void show(String menuItemName) {
75 | double width = 250;
76 | double height = 100;
77 | Button btnOK = new Button("OK");
78 | Label lblMenuItem = new Label(menuItemName + " Works!");
79 | lblMenuItem.setPrefWidth(width);
80 | VBox vBox = new VBox(15, lblMenuItem, btnOK);
81 | vBox.setPadding(new Insets(20));
82 | vBox.setAlignment(Pos.CENTER);
83 | Stage stage = new Stage();
84 | Scene scene = new Scene(vBox, width, height);
85 | stage.setScene(scene);
86 | stage.show();
87 | btnOK.setOnAction(e->stage.hide());
88 | }
89 |
90 | }
91 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/issue71/Launcher.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.issue71;
2 |
3 | import java.awt.*;
4 |
5 | public class Launcher {
6 |
7 | public static void main(String[] args) {
8 | System.setProperty("apple.awt.UIElement", "false");
9 | Toolkit.getDefaultToolkit();
10 | AddMenuItem.main(args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/notaskbaricon/Main.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.notaskbaricon;
2 |
3 | /*
4 | * Copyright (c) 2022 Michael Sims, Dustin Redmond and contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import com.dustinredmond.fxtrayicon.FXTrayIcon;
26 | import com.dustinredmond.fxtrayicon.RunnableTest;
27 | import javafx.application.Application;
28 | import javafx.application.Platform;
29 | import javafx.geometry.Insets;
30 | import javafx.geometry.Pos;
31 | import javafx.scene.Scene;
32 | import javafx.scene.control.Button;
33 | import javafx.scene.control.Label;
34 | import javafx.scene.control.TextField;
35 | import javafx.scene.layout.StackPane;
36 | import javafx.scene.layout.VBox;
37 | import javafx.stage.Stage;
38 | import javafx.stage.StageStyle;
39 | import java.net.URL;
40 |
41 | public class Main extends Application {
42 |
43 | /**
44 | * Launch the Start class FIRST!
45 | * @param stage The default JavaFX Stage
46 | */
47 | @Override
48 | public void start(Stage stage) {
49 | URL iconFile = new RunnableTest().getIcon();
50 | stage.initStyle(StageStyle.UTILITY);
51 | stage.setHeight(0);
52 | stage.setWidth(0);
53 | Stage mainStage = new Stage();
54 | mainStage.initOwner(stage);
55 | mainStage.initStyle(StageStyle.UNDECORATED);
56 |
57 | Label label = new Label("No TaskBar Icon");
58 | Label label2 = new Label("Type a message and click the button");
59 | label2.setAlignment(Pos.CENTER_LEFT);
60 | TextField tfInput = new TextField();
61 | Button button = new Button("Show Alert");
62 | button.setOnAction(e -> showMessage(tfInput.getText()));
63 |
64 | VBox vbox = new VBox();
65 | vbox.setPadding(new Insets(10,20,10,20));
66 | vbox.setAlignment(Pos.CENTER);
67 | vbox.setSpacing(20);
68 | vbox.getChildren().addAll(label, label2, tfInput, button);
69 |
70 | StackPane root = new StackPane();
71 | root.getChildren().add(vbox);
72 | mainStage.setScene(new Scene(root, 250, 200));
73 | mainStage.initStyle(StageStyle.UTILITY); //This is what makes the icon disappear in Windows.
74 | if (FXTrayIcon.isSupported()) {
75 | icon = new FXTrayIcon.Builder(stage, iconFile)
76 | .menuItem("Show Stage",e -> {
77 | Platform.runLater(()-> stage.setIconified(false));
78 | mainStage.show();})
79 | .menuItem("Hide Stage",e -> {Platform.runLater(() -> stage.setIconified(true) );
80 | mainStage.hide();})
81 | .menuItem("Show Message",e -> showMessage())
82 | .separator()
83 | .menuItem("Exit", e -> System.exit(0))
84 | .show()
85 | .build();
86 | }
87 | }
88 |
89 | private FXTrayIcon icon;
90 |
91 | private void showMessage() {
92 | icon.showInfoMessage("Check It Out!","Look Ma, No Taskbar Icon!");
93 | }
94 |
95 | private void showMessage(String message) {
96 | icon.showInfoMessage("Message For You!",message);
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/src/test/java/com/dustinredmond/fxtrayicon/notaskbaricon/Start.java:
--------------------------------------------------------------------------------
1 | package com.dustinredmond.fxtrayicon.notaskbaricon;
2 |
3 | /*
4 | * Copyright (c) 2022 Michael Sims, Dustin Redmond and contributors
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | import javafx.application.Application;
26 |
27 | public class Start {
28 |
29 | /**
30 | * THIS CLASS MUST BE RUN FIRST!
31 | *
32 | * Kicks off the com.dustinredmond.fxtrayicon.notaskbaricon.Main runnable test
33 | * @param args Command line arguments
34 | */
35 | public static void main(String[] args) {
36 | // This is an awt property which removes the icon
37 | // from the Dock on a mac and the TaskBar on Windows
38 | System.setProperty("apple.awt.UIElement", "true");
39 | java.awt.Toolkit.getDefaultToolkit();
40 |
41 | // This is a call to JavaFX application main method.
42 | // From now on we are transferring control to FX application.
43 | Application.launch(Main.class, args);
44 | }
45 |
46 | }
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/01.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/02.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/03.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/04.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/05.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/06.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/07.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/08.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/09.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/10.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/11.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/12.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/13.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/14.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/15.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/16.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/17.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/18.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/19.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/20.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/21.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/22.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/23.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/24.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/25.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/26.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/27.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/28.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/29.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/30.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/31.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/32.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/33.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/34.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/35.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/36.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/37.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/37.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/38.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/39.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/40.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/41.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/42.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/43.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/43.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/44.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/44.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/45.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/45.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/46.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/46.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/47.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/48.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/Tray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/One/Tray.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/00.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/01.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/02.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/03.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/04.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/05.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/06.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/07.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/08.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/09.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/10.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/11.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/12.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/13.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/14.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/15.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/16.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/17.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/18.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/19.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/20.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/21.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/22.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/23.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/24.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/25.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/26.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/27.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/28.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/29.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/30.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/31.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/32.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/33.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/34.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/35.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/36.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/37.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/37.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/38.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/39.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/40.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/41.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/Tray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Three/Tray.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/01.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/02.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/03.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/04.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/05.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/06.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/07.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/08.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/09.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/10.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/11.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/12.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/13.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/14.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/15.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/16.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/17.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/18.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/19.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/20.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/21.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/22.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/23.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/24.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/25.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/26.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/27.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/28.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/29.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/30.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/31.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/32.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/33.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/34.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/35.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/36.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/37.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/37.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/38.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/39.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/40.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/41.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/42.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/43.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/43.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/44.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/44.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/45.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/45.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/46.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/46.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/47.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/48.png
--------------------------------------------------------------------------------
/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/Tray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dustinkredmond/FXTrayIcon/47dff815b31ada7a898e86b7b6cd23df4e096f9f/src/test/resources/com/dustinredmond/fxtrayicon/animate/Two/Tray.png
--------------------------------------------------------------------------------