04 Nifty自定义带图片的下拉框

读了好久源代码,才搞明白怎么回事,其实现在回过头来想想很简单,主要是寻找的过程艰难。

自定义一个control

在resources里面新建一个文件夹MyControls,新建一个名为my-nifty-drop-down-control.xml的文件。

<?xml version="1.0" encoding="UTF-8"?>
<nifty-controls xmlns="http://nifty-gui.lessvoid.com/nifty-gui">
    <controlDefinition
            style="my-nifty-drop-down-style"
            name="my-dropDown"
            controller="de.lessvoid.nifty.controls.dropdown.DropDownControl"
            inputMapping="de.lessvoid.nifty.controls.dropdown.DropDownControlInputMapping"
            viewConverterClass="com.happykai.crack3d.utils.MyDropDownViewConverter">
        <panel style="#panel">
            <interact onClick="dropDownClicked()"/>
            <panel style="#panel-text">
                <image id="#text" height="22px"/>
            </panel>
            <panel style="#panel-icon">
                <image style="#icon"/>
            </panel>
        </panel>
    </controlDefinition>

    <popup id="dropDownBoxSelectPopup" style="my-nifty-drop-down-style" childLayout="absolute"
           controller="de.lessvoid.nifty.controls.dropdown.DropDownPopup">
        <interact onClick="close()"/>
        <panel id="#panel" style="#list-panel" height="200px">
            <control id="#listBox" name="my-listBox" horizontal="optional" displayItems="$displayItems"
                     selectionMode="Single" forceSelection="true"/>
        </panel>
    </popup>
    <!-- DROP DOWN BOX POPUP (The Actual List this is) -->
</nifty-controls>

注意:里的name叫做name=”my-dropDown”,在其他xml里就把这个name当做control的名字。里一定要加viewConverterClass="com.happykai.demo.utils.MyDropDownViewConverter",引号中内容是重写的viewConverter类的名字

**原本的dropdown里panel里放的是text,如果是图片下拉框,就需要改成image,其他的布局自己照猫画虎在这个panel里定义就好”

在使用它的xml里添加引用

在要使用它的xml里加一句话,加载标签的下一级就行,与screen平级。

 <useControls filename="MyControls/my-nifty-drop-down-control.xml"/>

新建MyDropDownViewConverter.java

该类作用是实现了viewConverter类,在源码中有这样一句话

/** * A simple implementation of DropDownViewConverter that will just use item.toString(). * This is the default DropDownViewConverter used when you don’t set a different implementation. * * @param * @author void public class SimpleDropDownViewConverter implements DropDownViewConverter { … } */ 所以呢,要想自定义下拉列表,就需要实现这个类,照猫画虎就行。

public class MyDropDownViewConverter implements DropDown.DropDownViewConverter<NiftyImage> {
    @Override
    public void display(@Nonnull Element itemElement, @Nonnull NiftyImage item) {
        ImageRenderer renderer = itemElement.getRenderer(ImageRenderer.class);
        if (renderer == null) {
            return;
        }
        renderer.setImage(item);
    }

    @Override
    public int getWidth(@Nonnull Element itemElement, @Nonnull NiftyImage item) {
        return 0;
    }
}

调用

DropDown<NiftyImage> drop = screen.findNiftyControl(id, DropDown.class);
assert drop != null;
for (int i = 1; i <= Constants.TEXTURE_NUM; i++) {
     NiftyImage image =
               nifty.createImage(screen, "Textures/" + String.valueOf(i) + ".png", false);

    drop.addItem(image);
}
drop.selectItemByIndex((dropNum - 1) % Constants.TEXTURE_NUM);

ok,到这里自定义的带图片下拉框就完成了。

但是存在内存泄漏的问题,这样的下拉框构建12个以上就会是opengl的内存溢出,因为明明是一样的下拉框,它却不会复用,一遍又一遍地把图片加到内存中,导致程序崩溃(默认的下拉框控件也是一样,会内存泄漏)。

该问题尚且未找到解决办法,如有同学解决还望告知,感谢分享。没解决前只能从交互上避免出现十几个下拉框的问题了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏帘卷西风的专栏

VS2010/VS2012 设置全局头文件和库路径

        在VS2010之前,设置项目的全局头文件和库路径是非常方便的,直接选择菜单Tools->Options->Projects and Soluti...

13020
来自专栏包子铺里聊IT

刷题外传之如何优雅的杀掉进程

进程(Process)是 Unix/Linux 系统下编程的核心知识。无论是小 Script 还是大 Daemon,启动后都是以进程的形势在 OS 中存在和执行...

40160
来自专栏difcareer的技术笔记

最新版MacOS(10.13.2)编译Android 4.4.4源码

网上搜一下Mac编译Android源码,能搜到很多,但最新版的MacOS(10.13.2)编译Android4.4.4的却没有,本文记录我的编译过程。

18240
来自专栏Timhbw博客

分享下平时我在windows平台下开发用的一些比较好的软件-WinSCP(四)

2016-03-1116:47:00 发表评论 722℃热度 WinSCP 它是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协...

31370
来自专栏進无尽的文章

扒虫篇-Bug日志 Ⅲ

解决方法:可能是由于粘贴网页上的代码的时候两行之间的回车引起的,有未识别的回车或者换行,找到,删除掉就 OK了。

15920
来自专栏FreeBuf

Xdigger Framework:一款网络安全测试辅助框架

*本文作者、Xdigger Framework开发者:guyoung Xdigger Framework是一款基于.Net Framework的网络安全测试辅助...

22670
来自专栏跟着阿笨一起玩NET

asp.net中为什么修改了配置文件后我们不需要重启IIS

本文转载:http://blog.itpub.net/12639172/viewspace-659819/

40710
来自专栏zhangdd.com

windows系统Tomcat启动过程中找不到JAVA_HOME解决方法

在winserver上明明已经安装了JDK1.6并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到。

10510
来自专栏散尽浮华

Ubuntu16.04下安装QQ的完整操作记录(经验证可用)

本机安装了Ubuntu16.04系统,用于日常运维办公。打算在Ubuntu上安装QQ,如下操作记录也使用于Ubuntu18.04:

14230
来自专栏信安之路

Window 提权基础

再加上个人的理解写出的关于 Windows 提权基础的文章,其中有些地方因为不太实用所以做了适当修改,感谢 @hl0rey 的帮助和建议。

31400

扫码关注云+社区

领取腾讯云代金券