我正在尝试在JME3的Nifty GUI中创建图像按钮,但是我的交互事件不起作用。我正在android中运行我的应用程序。该按钮似乎正在绘制,但事件不起作用。

这是我的控制权:

<?xml version="1.0" encoding="UTF-8"?>
<nifty-controls xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
<controlDefinition name="ddButton"
                   controller="com.myapp.gui.ButtonController">
    <panel id="bPanel" childLayout="overlay" focusable="true"
           visibleToMouse="true" width="$width" heigth="$height">
        <interact onClickRepeat="buttonDown()" onRelease="buttonUp()" />
        <image id="img-1" name="image-1" filename="Interface/res/button.png"
               imageMode="resize:0,255,0,0,0,255,0,101,0,255,0,0" visibleToMouse="false"
               width="100%" heigth="100%"/>
        <image id="img-2" name="image-2" filename="Interface/res/button-pressed.png"
               imageMode="resize:0,255,0,0,0,255,0,101,0,255,0,0" visibleToMouse="false"
               width="100%" heigth="100%"/>
        <text id="test" name="text" font="Interface/Fonts/MinionPro.fnt"
              color="#000f" text="$text" align="center" valign="center"
              width="80%" heigth="80%" visibleToMouse="false"/>
    </panel>
</controlDefinition>
</nifty-controls>


这是我的控制器:

package com.myapp.gui;

import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.controls.Controller;
import de.lessvoid.nifty.controls.FocusHandler;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.elements.render.ImageRenderer;
import de.lessvoid.nifty.input.NiftyInputEvent;
import de.lessvoid.nifty.render.NiftyImage;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.xml.xpp3.Attributes;
import java.util.Properties;

/**
 *
 * @author Paul
 */
public class ButtonController implements Controller {

    private Element img1;
    private Element img2;

    @Override
    public void bind(
            final Nifty nifty,
            final Screen screen,
            final Element element,
            final Properties parameter,
            final Attributes controlDefinitionAttributes) {
        img1 = element.getElements().get(0);
        img2 = element.getElements().get(1);
    }

    @Override
    public void init(Properties prprts, Attributes atrbts) {
    }

    @Override
    public void onStartScreen() {
        img1.show();
        img2.hide();
    }

    @Override
    public void onFocus(final boolean getFocus) {
    }

    @Override
    public boolean inputEvent(NiftyInputEvent inputEvent) {
        return false;
    }

    public void buttonDown() {
        img1.hide();
        img2.show();
    }

    public void buttonUp() {
        img1.show();
        img2.hide();
    }
}


这是我的屏幕:

<?xml version="1.0" encoding="UTF-8"?>
<nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
    <useStyles filename="nifty-default-styles.xml" />
    <useControls filename="Interface/custom-controls.xml" />

    <!-- +++++++++++++++++++++++++++++++++++++++ -->
    <!-- start screen -->
    <!-- +++++++++++++++++++++++++++++++++++++++ -->
    <screen id="start" controller="com.myapp.Main">
        <layer id="back" childLayout="center">
            <panel id="panel" height="100%" width="100%" align="center" valign="center"
                   childLayout="horizontal" visibleToMouse="true">
            <image filename="Interface/res/DD_Main.png"     imageMode="resize:0,1900,0,0,0,1900,0,1080,0,1900,0,0" height="100%"     width="100%"></image>
            </panel>
        </layer>
        <layer id="layer" childLayout="center">
            <panel id="panel" height="100%" width="100%" align="center" valign="center"
                   childLayout="horizontal" visibleToMouse="true">
                <panel height="100%" width="30%" childLayout="vertical">
                    <panel height="39%" width="100%" childLayout="center"></panel>
                    <panel height="10%" width="100%" childLayout="center">
                        <control id="ddButton1" name="ddButton" text="Test" width="70%" visibleToMouse="true"/>
                    </panel>
                    <panel height="1%" width="100%" childLayout="center">    </panel>
                    <panel height="10%" width="100%" childLayout="center">
                        <interact onClick="quit()"/>
                        <effect>
                            <onStartScreen name="move" mode="in" direction="top" length="300" startDelay="0" inherit="true"/>
                            <onEndScreen name="move" mode="out" direction="bottom" length="300" startDelay="0" inherit="true"/>
                            <onHover name="pulsate" scaleFactor="0.008" startColor="#f600" endColor="#ffff" post="true"/>
                        </effect>
                        <text id="text" font="Interface/Fonts/SegoeScript.fnt" color="#000f" text="Hello World!" align="center" valign="center" />
                    </panel>
                    <panel height="40%" width="100%" childLayout="center"></panel>
                </panel>
                <panel height="100%" width="70%" childLayout="center">    </panel>
            </panel>
        </layer>
    </screen>
</nifty>


而我的应用程序:

package com.myapp;

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.niftygui.NiftyJmeDisplay;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;

import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.screen.ScreenController;

/**
 * test
 *
 * @author Serge
 */
public class Main extends SimpleApplication implements ScreenController {

    private Nifty nifty;

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    @Override
    public void simpleInitApp() {

        Box b = new Box(1, 1, 1);
        Geometry geom = new Geometry("Box", b);

        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        geom.setMaterial(mat);

        rootNode.attachChild(geom);

        NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager,
            inputManager,
            audioRenderer,
            guiViewPort);
        nifty = niftyDisplay.getNifty();

        nifty.setDebugOptionPanelColors(false);

        nifty.fromXml("Interface/screens.xml", "start", this);

        // attach the nifty display to the gui view port as a processor
        guiViewPort.addProcessor(niftyDisplay);

        // disable the fly cam
//        flyCam.setEnabled(false);
//        flyCam.setDragToRotate(true);
        inputManager.setCursorVisible(true);

    }

    @Override
    public void simpleUpdate(float tpf) {
        //TODO: add update code
    }

    @Override
    public void simpleRender(RenderManager rm) {
        //TODO: add render code
    }

    public void bind(Nifty nifty, Screen screen) {
        System.out.println("bind( " + screen.getScreenId() + ")");
    }

    public void onStartScreen() {
        System.out.println("onStartScreen");
    }

    public void onEndScreen() {
        System.out.println("onEndScreen");
    }

    public void buttonDown() {
        System.out.println("buttonDown");
    }

}


制作Nifty GUI控件的例子很少,请帮帮我。

编辑

到目前为止,我已经确定是否可以这样做

flyCam.setEnabled(false);
flyCam.setDragToRotate(false);


我在控制器中收到事件,但仍无法在应用程序中获得onClick

最佳答案

在这些漂亮的东西上有些生锈,所以这可能不是答案,但也许会有所帮助。查看interact标签是否仅在以下环境下有效

<control id="ddButton1" name="ddButton" text="Test" width="70%" visibleToMouse="true">
    <interact ...>
</control>


查看nifty-button.xml,似乎正在使用inputMapping标签。因此,制作自定义按钮可能不是那么简单。

否则,您可以尝试使用事件订阅者的模式:
控制器中的@NiftyEventSubscriber(id="ddButton1")onButtonDown(final String topic,final ButtonClickedEvent event){

在控件方面,我发现nifty-gui Wiki非常安静:
https://github.com/void256/nifty-gui/wiki/Controls
另外,查看源代码示例也有很多好处。

祝好运

09-06 10:40