0

プログラムで制御されるパネル (iGoogle など) を備えたダッシュボードを設計しています。ここまでは順調ですね。一部のパネルではフィードを表示したいので、p:feedReader を使用しています。

内部にフィードリーダーを含むパネルを含むページを作成すると、問題なく動作します。だから私は正しいライブラリを使用しています。

プログラムでフィードリーダーを作成しようとすると、フィードのタイトルとコンテンツが表示されません。

私のテストページ:

<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<f:view contentType="text/html">
    <h:head>
        <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
        <meta http-equiv="refresh" content="600" />
        <link type="text/css" rel="stylesheet" href="styles/app.css" />
        <title>Test Panel</title>
    </h:head>
    <h:body>
        <f:event type="preRenderView" listener="#{panelBean.Init}" />
        <h:form id="frmPortal">

            <p:growl id="growl" showDetail="true" />

            <p:panel id="head" style="width: 1900; height: 100px; border: none; background: transparent;">

            </p:panel>

        <p:commandButton id="Test" value="Test" action="#{panelBean.Test}" style="margin-left: 20px;" />
        <p:commandButton id="Update" value="Update" action="#{panelBean.Test}" style="margin-left: 20px;" update="Feed1"/>

        </h:form>
    </h:body>
</f:view>
</html>

私の豆:

@ManagedBean(name="panelBean")
@ViewScoped
public class PanelBean implements Serializable {
    private static final long serialVersionUID = 403660770777505739L;
    private boolean renderPanel;
    private FeedReader feedReader;

    public void Init() {
        UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
        UIComponent component = viewRoot.findComponent("frmPortal");

        if (component == null) {
            System.out.println("Component is null");
        } else {
            System.out.println("Component is NOT null");
            Panel p = new Panel();
            p.setClosable(true);
            p.setHeader("Test");
            p.setId("Panel1");
            p.setVisible(true);

            feedReader = new FeedReader();
            feedReader.setId("Feed1");
            feedReader.setRendered(true);
            feedReader.setSize(5);
            feedReader.setValue("http://barrapunto.com/barrapunto.rss");
            feedReader.setVar("feed");

            HtmlOutputText outPutText = new HtmlOutputText();
            outPutText.setValue("#{feed.title}");
            p.getChildren().add(feedReader);            

            component.getChildren().add(p);

            RequestContext context = RequestContext.getCurrentInstance();  
            context.update("frmPortal");
        }
        renderPanel = true;
    }

    public boolean isRenderPanel() {
        return renderPanel;
    }

    public void setRenderPanel(boolean renderPanel) {
        this.renderPanel = renderPanel;
    }

    public void Test() {
        UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
        UIComponent component = viewRoot.findComponent("frmPortal");

        if (component == null) {
             System.out.println("Component is null");
        } else {

             System.out.println(component.getChildren().get(0).getId());
             System.out.println(component.getChildren().get(1).getId());
             System.out.println(component.getChildren().get(2).getId());
             System.out.println(component.getChildren().get(3).getId());
             System.out.println(component.getChildren().get(4).getId());
             Panel panel = (Panel) component.getChildren().get(4);

             FeedReader feed = (FeedReader) panel.getChildren().get(0);
             if (feed == null) {
                  System.out.println("FeedReader is null");
             } else {
                  System.out.println(feed.getId() + " - Size: " + feed.getSize() + " - Value: " + feed.getValue() + " - Var: " + feed.getVar());
             }
        }
    }
}
4

2 に答える 2

0

このコードを試すことができますか:

<h:form id="frmPortal">

    <p:panelGrid id="panelGrid" columns="1">
     <p:growl id="growl" showDetail="true" />

    </p:panelGrid>
    <p:commandButton id="Test" value="Test" action="#{panelBean.Test}" style="margin-left: 20px;" />
    <p:commandButton id="Update" value="Update" action="#{panelBean.Test}" style="margin-left: 20px;" update="Feed1"/>

</h:form>

@Augusto コードによる拡張バッキング Bean:

public void Init(){
    UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
    UIComponent component = viewRoot.findComponent("frmPortal");

    if (component != null) {
        p = new Panel();
        p.setClosable(true);
        p.setHeader("Test");
        p.setId("Panel1");
        p.setVisible(true);

        feedReader = new FeedReader();
        feedReader.setId("Feed1");
        feedReader.setRendered(true);
        feedReader.setSize(5);
        feedReader.setValue("http://barrapunto.com/barrapunto.rss");
        feedReader.setVar("feed");  

        FacesContext context = FacesContext.getCurrentInstance();
        ELContext elContext = context.getELContext();

        HtmlOutputText outputText = new HtmlOutputText();
        outputText.setId("Header");
        ValueExpression valueExpression = context.getApplication()
        .getExpressionFactory()
        .createValueExpression(elContext, "#{feed.title}", Object.class);
        outputText.setValueExpression("value", valueExpression);
        p.getChildren().add(feedReader);            
        component.getChildren().add(p);

        RequestContext reqContext = RequestContext.getCurrentInstance();  

        reqContext.update("Feed1");
    }
}

機能しない場合は、フィードリーダーなしで試してください。一方、1 つのフィード リーダーと多くのパネルを使用するのはなぜですか?

于 2013-10-20T19:31:54.717 に答える