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>
启动程序,点击按钮时结果如下: