如何在不设置面板标题的情况下使 p:dashboard 组件可拖动

Posted

技术标签:

【中文标题】如何在不设置面板标题的情况下使 p:dashboard 组件可拖动【英文标题】:How to make p:dashboard components draggable without panel header being set 【发布时间】:2016-03-19 16:16:18 【问题描述】:

作为此question 的后续行动。 p:dashboard 中的组件似乎只有在其父面板具有标题集(包含标题)时才可拖动。即使没有设置标题,我该如何制作面板也可以拖动?所以整个面板将是拖动它的句柄,而不仅仅是标题。

Xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>Example</title>
</h:head>
<h:body>
    <h:form id="splitButtonForm">
        <p:splitButton value="Action" icon="ui-icon-circle-triangle-s">
            <p:menuitem value="New text entry" icon="ui-icon-newwin"
                actionListener="#dashboardView.addTextWidget"
                update="dashboardForm:dashboardPanel" />
        </p:splitButton>
    </h:form>

    <div style="height: 500px">
        <h:form id="dashboardForm">
            <p:dashboard id="dashboardPanel" model="#dashboardView.model"
                binding="#dashboardView.dashboardPanel ">
                <p:ajax event="reorder" />
            </p:dashboard>
            <div style="clear: both" />
        </h:form>
    </div>
</h:body>
</html>

还有豆子

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.event.ActionEvent;

import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.panel.Panel;
import org.primefaces.model.DashboardColumn;
import org.primefaces.model.DashboardModel;
import org.primefaces.model.DefaultDashboardColumn;
import org.primefaces.model.DefaultDashboardModel;

@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class DashboardView implements Serializable


    private DashboardModel model;

    private UIComponent dashboardPanel;

    public void addTextWidget(ActionEvent event)
    

        Panel panel = new Panel();

        InputText textWidget = new InputText();

        int childCount = dashboardPanel.getChildCount();

        String widgetId = "widget" + String.valueOf(childCount);

        panel.setHeader(widgetId); //I don't want to have to do this

        panel.setId(widgetId);
        panel.getChildren().add(textWidget);

        addWidget(widgetId);

        dashboardPanel.getChildren().add(panel);
    

    public void addWidget(String widgetId)
    
        DashboardColumn column1 = model.getColumn(0);
        column1.addWidget(widgetId);
    

    public UIComponent getDashboardPanel()
    
        return dashboardPanel;
    

    public DashboardModel getModel()
    
        return model;
    

    @PostConstruct
    public void init()
    
        model = new DefaultDashboardModel();
        DashboardColumn column1 = new DefaultDashboardColumn();
        DashboardColumn column2 = new DefaultDashboardColumn();

        model.addColumn(column1);
        model.addColumn(column2);
    

    public void setDashboardPanel(UIComponent dashboardPanel)
    
        this.dashboardPanel = dashboardPanel;
    


【问题讨论】:

解决方案:查看 PrimeFaces 源并对其进行调整... 【参考方案1】:

Kukeltje 说得对,基本上它归结为 handle 属性在 JS PrimeFaces.widget.Dashboard init 函数中被硬编码。我使用相同的代码创建了自己的 javascript 文件,但没有设置句柄属性,然后在 h:body 之后使用 h:outputScript 包含该脚本

这是javascript

PrimeFaces.widget.Dashboard = PrimeFaces.widget.BaseWidget
        .extend(
            init : function(b) 
                this._super(b);
                this.cfg.connectWith = this.jqId + " .ui-dashboard-column";
                this.cfg.placeholder = "ui-state-hover";
                this.cfg.forcePlaceholderSize = true;
                this.cfg.revert = false;

                var a = this;
                if (this.cfg.behaviors) 
                    var c = this.cfg.behaviors.reorder;
                    if (c) 
                        this.cfg.update = function(h, g) 
                            if (this === g.item.parent()[0]) 
                                var f = g.item.parent().children().filter(
                                        ":not(script):visible").index(g.item), i = g.item
                                        .parent().parent().children().index(
                                                g.item.parent());
                                var d = 
                                    params : [ 
                                        name : a.id + "_reordered",
                                        value : true
                                    , 
                                        name : a.id + "_widgetId",
                                        value : g.item.attr("id")
                                    , 
                                        name : a.id + "_itemIndex",
                                        value : f
                                    , 
                                        name : a.id + "_receiverColumnIndex",
                                        value : i
                                     ]
                                ;
                                if (g.sender) 
                                    d.params.push(
                                        name : a.id + "_senderColumnIndex",
                                        value : g.sender.parent().children()
                                                .index(g.sender)
                                    )
                                
                                c.call(a, d)
                            
                        
                    
                
                $(this.jqId + " .ui-dashboard-column").sortable(this.cfg)
            
        );

以及XHTML的相关部分

<h:body>
    <h:outputScript library="js" name="pfaces.js" />
    ...
</h:body>

【讨论】:

以上是关于如何在不设置面板标题的情况下使 p:dashboard 组件可拖动的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用滤镜的情况下使图像变暗? [复制]

如何在不先启动 IE 的情况下使我的 WinCE 应用程序中的网络工作?

如何在不需要额外点击的情况下使 DataGridCheckBoxColumn 可编辑?

dequeueBuffer: 不能在不设置缓冲区计数的情况下使多个缓冲区出队

如何在不使用 div 的情况下使 iframe 响应?

如何在不重复自己的情况下使该算法更懒惰?