简体   繁体   English

JPAContainer在表中添加组件?

[英]JPAContainer add component in table?

I'm looking for a how to add a component in my table. 我正在寻找一种如何在表中添加组件。 My table is using a JPAContainer as datasource. 我的表使用JPAContainer作为数据源。 I'm trying using addContainerProperty but doesn't work and returns an exception. 我正在尝试使用addContainerProperty,但无法正常工作并返回异常。

I'm trying this 我正在尝试

private final CustomJPAContainer<Curriculum> datasource = new CustomJPAContainer<Curriculum>(Curriculum.class);

Button btnView = new Button();
Table tabela = new Table("",datasource);
tabela.addContainerProperty("View", Button.class, null);


//exception 
java.lang.UnsupportedOperationException
    at com.vaadin.addon.jpacontainer.JPAContainer.addContainerProperty(JPAContainer.java:666)
    at com.vaadin.ui.AbstractSelect.addContainerProperty(AbstractSelect.java:806)
    at com.vaadin.ui.Table.addContainerProperty(Table.java:4260)
    at br.ind.ibg.views.VisualizarCurriculum.buildLayout(VisualizarCurriculum.java:58)
    at br.ind.ibg.views.VisualizarCurriculum.<init>(VisualizarCurriculum.java:36)
    at br.ind.ibg.utils.MenuSistema$1.menuSelected(MenuSistema.java:60)
    at com.vaadin.ui.MenuBar.changeVariables(MenuBar.java:186)
    at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:396)
    at com.vaadin.server.communication.ServerRpcHandler.handleBurst(ServerRpcHandler.java:221)
    at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:111)
    at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:91)
    at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:37)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1382)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

Any idea ? 任何想法 ?

/** edited */ I solved the problem using setGeneratedColumn() / **编辑* /我使用setGeneratedColumn()解决了问题

Here how I did. 这是我的工作方式。

public class ButtonColumnGenerator implements Table.ColumnGenerator{
    private static final long serialVersionUID = 1L;

    @Override
    public Object generateCell(Table source, Object itemId, Object columnId) {
        Property prop = source.getItem(itemId).getItemProperty(columnId);
        Button btnView = new Button();
        btnView.setData(itemId);
        btnView.setDescription("Curriculum: " + itemId);
        btnView.setIcon(new ThemeResource("../icons/eye.png"));             
        btnView.setWidth("20px");
        btnView.setHeight("20px");
        btnView.setStyleName(Reindeer.BUTTON_LINK);     

        return btnView;
    }
}


/*** my app */
Button btnView = new Button();
Table tabela = new Table("",datasource);
tabela.setVisibleColumns(new Object[]{"idCurriculum", "nome", "cpf"});      
tabela.setColumnHeaders(new String[] {"#", "Nome", "Cpf"});
tabela.addGeneratedColumn("", new ButtonColumnGenerator());

now works ! 现在有效!

Adding UI components to the data source of a select component (Table, Tree, TreeTable, ComboBox, ...) is the wrong approach for your problem. 将UI组件添加到选择组件(表,树,树表,组合框等)的数据源是解决问题的错误方法。 The container data source of a Table component only contains the data model of the table and not the components that will display this data. Table组件的容器数据源仅包含表的数据模型,而不包含将显示此数据的组件。

So, instead of adding properties to the JPAContainer (which is disallowed for this container as it handles its properties internally), you set a custom com.vaadin.ui.TableFieldFactory to your table with Table.setTableFieldFactory(TableFieldFactory fieldFactory) . 因此,您无需向JPAContainer添加属性(此容器在内部处理其属性就不允许这样做),而是使用com.vaadin.ui.TableFieldFactory Table.setTableFieldFactory(TableFieldFactory fieldFactory)将自定义com.vaadin.ui.TableFieldFactory设置为表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM