如何在Primefaces数据表中为每列定义上下文菜单?放在<p:contextMenu>
里面<p:column>
不能正常工作.我希望上下文菜单不同,具体取决于右键单击的列用户.
这不起作用(为所有列创建的上下文菜单相同):
<p:dataTable value="#{values}" var="value" selectionMode="single" selection="#{selectedValue}" id="table">
<p:column headerText="Col 1">
<h:outputText value="#{value.balance}">
<f:convertNumber type="currency"></f:convertNumber>
</h:outputText>
<p:contextMenu>
<p:menuitem value="Report"></p:menuitem>
<p:menuitem value="Change"></p:menuitem>
</p:contextMenu>
</p:column>
<p:column headerText="col 2" >
<h:outputText value="#{value.balance2}">
<f:convertNumber type="currency"></f:convertNumber>
</h:outputText>
<p:contextMenu>
<p:menuitem value="Something else"></p:menuitem>
</p:contextMenu>
</p:column>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)
如何通过使用PF组件,扩展PF组件或添加自定义JavaScript在Primefaces dataTable中添加特定于列的上下文菜单?
Primefaces 3.5,Mojarra 2.1.14.这是我的PF数据表,它包含一个名为'automatic'的不可编辑的布尔列,以及可编辑的'label'列:
<p:dataTable value="#{bean.contents}" paginator="true" var="row"
editable="true" editMode="cell" rows="25" rowsPerPageTemplate="10,25,50" id="list">
<p:column>
<f:facet name="header"><h:outputText value="header1" /></f:facet>
<p:selectBooleanCheckbox value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>
</p:column>
<p:column>
<f:facet name="header"><h:outputText value="header2" /></f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.label}"></h:outputText>
</f:facet>
<f:facet name="input">
<p:inputText value="#{row.label}"></p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="isAutomatic"/>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)
单元格编辑事件监听器:
public void onEditLabel(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
if(newValue != null && !newValue.equals(oldValue)) {
DataTable s = (DataTable) event.getSource();
MyEntity d = (MyEntity) s.getRowData();
try {
d.setAutomatic(false);
myDAO.save(d); …
Run Code Online (Sandbox Code Playgroud) 我正在 OOM 上转储堆(OpenJDK 7)
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/jvm.hprof
Run Code Online (Sandbox Code Playgroud)
启动选择我的虚拟机。我的磁盘空间不足,无法存储多个转储(堆大小为 6g)。有没有办法强制 JVM 覆盖转储文件?目前,它会抱怨“文件存在”并保持现有转储完好无损。我已阅读 Sun 的文档,但似乎没有任何强制覆盖的选项
考虑一个简单的h:outputText组件:
<h:outputText value="#{myBean.myValue}"/>
Run Code Online (Sandbox Code Playgroud)
如何在页面渲染后延迟加载该值,并在完成此操作时显示自定义'ajax loading'图标而不是值?
我在我的项目中使用PrimeFaces 3.5,因此欢迎任何特定于PF的实现.
我的webapp中有ajax加载模式对话框:
<p:dialog widgetVar="statusDialog" modal="true" draggable="false" minimizable="false" appendToBody="true"
closable="false" header="Processing..." resizable="false" maximizable="false" style="overflow:hidden !important; overflow-x: hidden !important; width:auto;">
<p:graphicImage library="assets" name="ajax-loader.gif" style="overflow:hidden !important; overflow-x: hidden !important;"></p:graphicImage>
</p:dialog>
<p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/>
Run Code Online (Sandbox Code Playgroud)
无论什么CSS样式(我尝试过各种溢出/溢出-x等组合)我用它仍然显示水平(垂直隐藏,没有问题)滚动条.我还玩过appendToBody属性.
我需要禁用水平滚动条.
编辑:这是PrimeFaces呈现的HTML
<div id="j_idt18" class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-shadow ui-overlay-hidden" style="overflow: hidden; width: auto; height: auto; left: 832px; top: 210px; visibility: hidden; z-index: 1003; display: block;" role="dialog" aria-labelledby="j_idt18_title" aria-hidden="true" aria-live="off">
<div class="ui-dialog-titlebar ui-widget-header ui-helper-clearfix ui-corner-top">
<span id="j_idt18_title" class="ui-dialog-title">Processing...</span>
</div>
<div class="ui-dialog-content ui-widget-content" style="height: auto;"><img id="j_idt19" src="/webapp/do/javax.faces.resource/ajax-loader.gif?ln=assets" alt="">
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我已经能够通过覆盖我自己的样式表中的默认对话框CSS来摆脱滚动条: …
我注意到几乎所有将'动态'属性设置为'true'的PF组件只会在短暂延迟后显示(这是可以理解的),并且也不会触发ajax启动/停止事件.
这是我(完全正常工作)的Ajax状态组件,为简洁省略了实际的对话框内容:
<p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();" onerror="errorDialog.show();"/>
Run Code Online (Sandbox Code Playgroud)
这是一个动态加载的对话框.它需要从支持bean获取数据:
<p:dialog modal="true" widgetVar="confDialog" position="center" id="confD" dynamic="true">
<p:panelGrid>
<p:row>
<p:column>
<h:outputText value="Date"></h:outputText>
</p:column>
<p:column>
<h:outputText value="#{myBean.currentDate}">
<f:convertDateTime locale="#{myBean.currentLanguage}" type="both" dateStyle="full" timeStyle="full" timeZone="#{myBean.currentTimeZone}"></f:convertDateTime>
</h:outputText>
</p:column>
</p:row>
</p:panelGrid>
<p:commandButton value="Close" type="button" onclick="confDialog.hide();">
</p:commandButton>
</p:dialog>
Run Code Online (Sandbox Code Playgroud)
执行某些操作并显示动态加载的确认对话框的命令按钮:
<p:commandButton value="Do it" type="submit" ajax="true" process="@form"
action="#{bean.processForm}"
oncomplete="if(!args.validationFailed){confDialog.show();}"
update="confD @form"/>
Run Code Online (Sandbox Code Playgroud)
当命令按钮将数据提交给支持bean并获取数据时,将显示Ajax状态对话框.然后ajax状态对话框消失,延迟1-2秒,并显示确认对话框.
动态加载的选项卡也是如此(在PF tabView组件中).
为什么在动态组件加载期间不显示我的ajax状态对话框?我怎么展示它?
编辑:
感谢@partlov通过在动态加载的对话框中添加JQ ajax启动/停止处理程序,我找到了一个没有覆盖PF函数的解决方案:
jQuery(document).ready(function() {
confDialog.getJQ().ajaxStart(function(){statusDialog.show()});
confDialog.getJQ().ajaxStop(function(){statusDialog.hide()});
});
Run Code Online (Sandbox Code Playgroud) 我有一个常规的Ajax PF progressBar:
<p:progressBar value="#{myTask.progress}" labelTemplate="{value}%" ajax="true" widgetVar="progress">
<p:ajax event="complete" oncomplete="progress.cancel();"></p:ajax>
</p:progressBar>
Run Code Online (Sandbox Code Playgroud)
每当progressBar更新它的值时,如何运行我的JavaScript代码?
我已经定义了自己的CSS类:
.my-ui-table td {
border-width: 1px;
border: 0;
padding: 5px 10px;
border-style: hidden;
border-color: inherit;
}
Run Code Online (Sandbox Code Playgroud)
默认的PrimeFaces css定义了自己应用于的类:
.ui-panelgrid td {
border-width: 1px;
border-style: solid;
border-color: inherit;
padding: 4px 10px;
}
Run Code Online (Sandbox Code Playgroud)
这两个类都应用于表:
<table class="ui-panelgrid ui-widget my-ui-table" role="grid">...</table>
Run Code Online (Sandbox Code Playgroud)
当Chrome呈现所述表时,ui-panelgrid类的border-style优先于my-ui-table类中定义的border-style.我一直在阅读CSS特异性,它的两种类定义的特殊性是相同的,所以在class =""属性中最后指定的那个应该获胜.为什么不发生这种情况?
编辑:HTML头标记:
<head>
<link type="text/css" rel="stylesheet" href="/webapp/do/javax.faces.resource/my.css?ln=css">
<link type="text/css" rel="stylesheet" href="/webapp/do/javax.faces.resource/primefaces.css?ln=primefaces">
</head>
Run Code Online (Sandbox Code Playgroud)
.
我需要在任何正在运行的应用程序之上显示系统覆盖窗口.它工作正常,但只有当我的应用程序的活动在前台时.这是我使用的代码:
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_DIM_BEHIND |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.CENTER | Gravity.TOP;
params.dimAmount = 0.3f;
wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
mainAlertView = View.inflate(ctx, R.layout.system_alert_view, null);
wm.addView(mainAlertView, params);
Run Code Online (Sandbox Code Playgroud)
添加到WindowManager的视图包含空的LinearLayout,我在运行时添加了子视图:
mainAlertLayout.addView(childView);
Run Code Online (Sandbox Code Playgroud)
清单xml已SYSTEM_ALERT_WINDOW
定义权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Run Code Online (Sandbox Code Playgroud)
当我的活动在前台运行时,这一切都很有效.只要我切换到任何其他应用程序或主屏幕,就不会显示叠加层.我调试了代码,它确实在运行wm.addView(),它没有抛出任何异常.我还玩过LayoutParams标志(删除了KEEP_SCREEN_ON和相关的等),但没有任何区别.
Android 4.4.2 fwiw
primefaces ×7
jsf ×4
jsf-2 ×3
css ×2
ajax ×1
android ×1
contextmenu ×1
datatable ×1
jvm ×1
jvm-hotspot ×1
layoutparams ×1