TableView模态弹窗,并屏蔽下层的按钮响应

上一讲我们说了用tableview做一个帮助界面,考虑到很多的帮助界面都是弹出式的,因此今天又加上这篇文章,来完善之前的帮助。

cocos2dx的触摸事件比较麻烦,当前的版本还没有如windowsMFC那样的方便,现在要做比较麻烦,据说3.0版本会建立消息机制,期待ing...

现在就讲在2.X版本下的处理,要屏蔽掉下层,可以将tableview层设计成有最高响应权限的层,这个可以通过

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128, true);

-128这个常量定义是指响应的最高优先级,也就是按钮的响应优先级,想要屏蔽掉下层的按钮必须是这个值

最后一个参数代表本层需要吞噬触摸,即一旦这个优先级的触摸被响应,那么其他优先级低的就不能再响应了

这个需要在ccToucnBegan里面返回true;

这个来处理,不过需要注意的是,必须在init()里面打开触摸事件,不然registerWithTouchDispatcher不会被调用

setTouchEnabled(true);

好了,上代码

class TableViewTestLayer : public cocos2d::CCLayer, public cocos2d::extension::CCTableViewDataSource, public cocos2d::extension::CCTableViewDelegate
{
public:
   
    virtual bool init();    // 初始化,在里面放个tableview
   virtual void registerWithTouchDispatcher(void);   // 重载它来进行优先级的控制
  //以下三个函数必须重载,让tableview来处理这些事件,否则它不会工作
   virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
   virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
   virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
// 响应按钮事件
void toExtensionsMainLayer(CCObject *sender) {removeFromParent();}

CCTableView* tableView;
}
这个层就是我们的有tableview的层
bool TableViewTestLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
tableView->ccTouchBegan(pTouch, pEvent);
return true;  // 返回true 屏蔽掉其他优先级低的控件
}


void TableViewTestLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
tableView->ccTouchMoved(pTouch, pEvent);
CCLOG("------bouch moved--------");

}


void TableViewTestLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
CCLOG("------bouch end--------");
tableView->ccTouchEnded(pTouch, pEvent);
}
// 一定要通过重载此函数来实现优先级的控制。在onenter onexit里面处理的时候会带来额外的工作量
//会导致本层的按钮也被屏蔽,而通过此函数注册的不会,用此函数最官方,若一定要从onEnter onExit里面注册,那么菜单也得加到
// ccTouchBegan, ccTouchMoved,ccTouchEnded中,并且判断按钮是不是按下,非常麻烦
void TableViewTestLayer::registerWithTouchDispatcher()
{
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128, true);
}

bool TableViewTestLayer::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }


CCSize winSize = CCDirector::sharedDirector()->getWinSize();


_width = 480;
_height = 200;

tableView = CCTableView::create(this,  CCSizeMake(480, 200));
tableView->setDirection(kCCScrollViewDirectionVertical);
//tableView->setPosition(ccp(winSize.width-150,winSize.height/2-120));
tableView->setPosition(ccp(0 ,80));
tableView->setDelegate(this);
tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
this->addChild(tableView);
tableView->reloadData();


// Back Menu
CCMenuItemFont *itemBack = CCMenuItemFont::create("Back", this, menu_selector(TableViewTestLayer::toExtensionsMainLayer));
itemBack->setPosition(ccp(100,  25));
CCMenu* menuBack = CCMenu::create(itemBack, NULL);
menuBack->setPosition(CCPointZero);
addChild(menuBack);


setTouchEnabled(true);


    return true;
}


最后,需要在关闭时将自己从当前运行的父对象中清除就OK了!

在JavaFX中,TableViewController允许你动态地添加内容,并可以为每个表格行提供额外的功能,如查看详情按钮。以下是一个基本步骤: 1. 首先,你需要创建`TableView`,它负责显示数据。你可以使用`TableView<Node>`,其中`Node`是包含其他UI元素的容器。 ```java TableView<MyData> tableView = new TableView<>(); ``` 2. 定义`MyData`类,包含数据属性以及一个表示查看详情的字段,比如`String detailLink`。 ```java public class MyData { private String mainInfo; private String detailLink; // getters and setters } ``` 3. 创建`TableCell`,用于渲染每个单元格并包含你的查看详情按钮。在这里,我们可以用`Button`作为单元格的一部分: ```java Button showDetailsButton = new Button("查看详情"); showDetailsButton.setOnAction(e -> handleShowDetailsEvent()); // 在TableCell的构造函数里绑定数据和事件处理 TableCell<MyData, String> cellFactory = new TableCell<MyData, String>() { protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (empty || getItem() == null) { setGraphic(null); } else { setGraphic(showDetailsButton); // 设置按钮为单元格图形 showDetailsButton.setText(getItem().getDetailLink()); } } private void handleShowDetailsEvent() { // 这里可以实现点击按钮后的详情查看逻辑,例如跳转到新的窗口或页面 } }; ``` 4. 将`cellFactory`设置给`TableView`: ```java tableView.setRowFactory(tv -> new TableRow<MyData>() { @Override protected void updateItem(MyData item, boolean empty) { super.updateItem(item, empty); if (item != null) { getItems().setAll(Arrays.asList(item.getMainInfo())); } else { getItems().clear(); } } }); tableView.getItems().addAll(yourDataList); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值