JMonkeyEngine3——NiftyGui Button

Button

Button 控件显示一个简单的按钮,用户可以点击它。可以使用 ButtonBuilder 类从 Java 动态创建按钮,也可以使用 <control></control> 标签并指定name="button"从 XML 创建按钮。

常用属性

Name Datatype Default Description
label String "" 显示按钮文本.

EventBus Notification

按钮支持 EventBus 通知,用于激活按钮的任何操作(鼠标单击或键盘激活)。在这​​种情况下,将使用按钮的 ID 作为事件的主题发布 ButtonClickedEvent。请注意,ButtonClickedEvent 只是一个空类。如果您收到它,则表示按钮已被激活。

Java Builder 示例

1 // Using the builder pattern
2 control(new ButtonBuilder("appendButton", "Append"));

XML 示例

1 <!-- simple button. please note: event notification requires an id -->
2 <control id="appendButton" name="button" label="Append" />

参考

https://github.com/nifty-gui/nifty-gui/wiki/Button

案例

创建一个NiftyGui xml,命名为NiftyGuiButton,修改如下:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <nifty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nifty-gui.lessvoid.com/nifty-gui" xsi:schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd">
 3     <useControls filename="nifty-default-controls.xml"/>
 4     <useStyles filename="nifty-default-styles.xml"/>
 5     <screen id="screen0">
 6         <layer id="layer0" childLayout="center">
 7             <control name="button" id="testButton" height="30.0px" width="10.0%" align="center" label="TEST" childLayout="center" valign="center" y="276" x="355"/>
 8         </layer>
 9     </screen>
10 </nifty>

创建一个java类,启动并渲染screen0,如下:

 1 import com.jme3.app.SimpleApplication;
 2 import com.jme3.niftygui.NiftyJmeDisplay;
 3 import de.lessvoid.nifty.Nifty;
 4 
 5 /**
 6  * @date 2024年7月11日17点34分
 7  * @author JohnKkk
 8  */
 9 public class NiftyGuiButton extends SimpleApplication{
10 
11     private Nifty m_Nifty;
12 
13     @Override
14     public void simpleInitApp() {
15         // 初始化Nifty
16         NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
17                 assetManager,
18                 inputManager,
19                 audioRenderer,
20                 guiViewPort);
21         m_Nifty = niftyDisplay.getNifty();
22         // 将NiftyGUI显示对象添加到JME3中
23         guiViewPort.addProcessor(niftyDisplay);
24         
25         m_Nifty.fromXml("Interface/NiftyGuiButton.xml", "screen0");
26         
27         // 禁用flyCam并显示鼠标
28         flyCam.setEnabled(false);
29         inputManager.setCursorVisible(true);
30     }
31     
32     public static void main(String[] args) {
33         NiftyGuiButton niftyGuiButton = new NiftyGuiButton();
34         niftyGuiButton.start();
35     }
36 }

 事件绑定

JMonkeyEngine3——NiftyGui ScreenController一文中,我们已经知道事件绑定需要通过ScreenController进行,所以我们修改java代码如下:

 1 import com.jme3.app.SimpleApplication;
 2 import com.jme3.niftygui.NiftyJmeDisplay;
 3 import de.lessvoid.nifty.Nifty;
 4 import de.lessvoid.nifty.screen.Screen;
 5 import de.lessvoid.nifty.screen.ScreenController;
 6 
 7 /**
 8  * @date 2024年7月11日17点34分
 9  * @author JohnKkk
10  */
11 public class NiftyGuiButton extends SimpleApplication implements ScreenController{
12 
13     private Nifty m_Nifty;
14 
15     @Override
16     public void simpleInitApp() {
17         // 初始化Nifty
18         NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
19                 assetManager,
20                 inputManager,
21                 audioRenderer,
22                 guiViewPort);
23         m_Nifty = niftyDisplay.getNifty();
24         // 将NiftyGUI显示对象添加到JME3中
25         guiViewPort.addProcessor(niftyDisplay);
26         
27         m_Nifty.fromXml("Interface/NiftyGuiButton.xml", "screen0");
28         
29         // 禁用flyCam并显示鼠标
30         flyCam.setEnabled(false);
31         inputManager.setCursorVisible(true);
32     }
33     
34     public static void main(String[] args) {
35         NiftyGuiButton niftyGuiButton = new NiftyGuiButton();
36         niftyGuiButton.start();
37     }
38     
39     /**
40      * 按钮点击回调事件.<br/>
41      * @param text 传递的参数
42      */
43     public void onClickEvent(String text){
44         System.out.println(text);
45     }
46 
47     @Override
48     public void bind(Nifty nifty, Screen screen) {
49     }
50 
51     @Override
52     public void onStartScreen() {
53     }
54 
55     @Override
56     public void onEndScreen() {
57     }
58 }

我们实现ScreenController接口并添加了一个public void onClickEvent()函数,然后修改xml文件如下:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <nifty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nifty-gui.lessvoid.com/nifty-gui" xsi:schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd">
 3     <useControls filename="nifty-default-controls.xml"/>
 4     <useStyles filename="nifty-default-styles.xml"/>
 5     <screen id="screen0" controller="mygame.NiftyGuiButton">
 6         <layer id="layer0" childLayout="center">
 7             <control name="button" id="testButton" visibleToMouse="true" height="30.0px" width="10.0%" align="center" label="TEST" childLayout="center" valign="center" y="276" x="355">
 8                 <interact onClick="onClickEvent(111)" />
 9             </control>
10         </layer>
11     </screen>
12 </nifty>

启动游戏后点击按钮,执行结果如下:

 事件类型

JMonkeyEngine3——NiftyGui 控件基本事件类型一文中,我们了解到有一组基本的事件,现在来尝试其他事件,修改java代码,添加如下代码:

 1 public class NiftyGuiButton extends SimpleApplication implements ScreenController{
 2 
 3     private Nifty m_Nifty;
 4 
 5     @Override
 6     public void simpleInitApp() {
 7         // 初始化Nifty
 8         NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
 9                 assetManager,
10                 inputManager,
11                 audioRenderer,
12                 guiViewPort);
13         m_Nifty = niftyDisplay.getNifty();
14         // 将NiftyGUI显示对象添加到JME3中
15         guiViewPort.addProcessor(niftyDisplay);
16         
17         m_Nifty.fromXml("Interface/NiftyGuiButton.xml", "screen0");
18         
19         // 禁用flyCam并显示鼠标
20         flyCam.setEnabled(false);
21         inputManager.setCursorVisible(true);
22     }
23     
24     public static void main(String[] args) {
25         NiftyGuiButton niftyGuiButton = new NiftyGuiButton();
26         niftyGuiButton.start();
27     }
28     
29     /**
30      * 按钮点击回调事件.<br/>
31      * @param text 传递的参数
32      */
33     public void onClickEvent(String text){
34         System.out.println(text);
35     }
36     
37     /**
38      * 鼠标释放按钮回调事件.<br/>
39      */
40     public void onReleaseEvent(){
41         System.out.println("鼠标释放按钮");
42     }
43     
44     /**
45      * 多次点击事件回调.<br/>
46      */
47     public void onMultiClickEvent(){
48         System.out.println("鼠标多次点击");
49     }
50 
51     @Override
52     public void bind(Nifty nifty, Screen screen) {
53     }
54 
55     @Override
56     public void onStartScreen() {
57     }
58 
59     @Override
60     public void onEndScreen() {
61     }
62 }

然后修改xml,添加事件绑定:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <nifty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nifty-gui.lessvoid.com/nifty-gui" xsi:schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd">
 3     <useControls filename="nifty-default-controls.xml"/>
 4     <useStyles filename="nifty-default-styles.xml"/>
 5     <screen id="screen0" controller="mygame.NiftyGuiButton">
 6         <layer id="layer0" childLayout="center">
 7             <control name="button" id="testButton" visibleToMouse="true" height="30.0px" width="10.0%" align="center" label="TEST" childLayout="center" valign="center" y="276" x="355">
 8                 <interact onClick="onClickEvent(111)" onRelease="onReleaseEvent()" onMultiClick="onMultiClickEvent()" />
 9             </control>
10         </layer>
11     </screen>
12 </nifty>

执行后结果如下:

 双击按钮回调onMultiClickEvent()方法,释放时回调onReleaseEvent()方法。

我们还可以为button订阅事件,通过EventBus,修改Java代码添加如下函数:

1 @NiftyEventSubscriber(id="testButton")
2     public final void onButtonClickedEvent(final String id, final ButtonClickedEvent event){
3         System.out.println("id:" + id + ",EventBus通知!");
4     }

然后,我们需要删除xml中<control name="button" id="testButton">的子元素<interact/>,如下:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <nifty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nifty-gui.lessvoid.com/nifty-gui" xsi:schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd">
 3     <useControls filename="nifty-default-controls.xml"/>
 4     <useStyles filename="nifty-default-styles.xml"/>
 5     <screen id="screen0" controller="mygame.NiftyGuiButton">
 6         <layer id="layer0" childLayout="center">
 7             <control name="button" id="testButton" visibleToMouse="true" height="30.0px" width="10.0%" align="center" label="TEST" childLayout="center" valign="center" y="276" x="355">
 8             </control>
 9         </layer>
10     </screen>
11 </nifty>

启动程序,点击按钮时结果如下:

posted @ 2024-07-11 17:27  JhonKkk  阅读(42)  评论(0)    收藏  举报