1

问题

您好,我正在尝试配置 Wickets 反馈消息的颜色。我目前正在维护一个 Wicket GUI(Wicket 7.6.1)。似乎Session.get().warn("Watch out!")打印了一个绿色警告框,并带有 CSS class 注释alert-success。我想把它的颜色变成黄色。

到目前为止我得到了什么:

我发现这Session.get().getApplication().getResourceSettings()让我可以访问一些资源设置,包括属性工厂。但我不知道如何使用它。另外,我已经查找了与我的 Session 相关的标记文件,但没有找到。

任何帮助将不胜感激!

4

3 回答 3

1

如果需要,您可以创建自定义反馈面板。

CustomFeedBackPanel.html

<wicket:panel>
    <div wicket:id="feedbackul">
        <wicket:container wicket:id="messages">
            <p wicket:id="message"></p>
        </wicket:container>
    </div>

</wicket:panel>

CustomFeedBackPanel.java

public class CustomFeedbackPanel extends Panel implements IFeedback {

    private static final long serialVersionUID = 1L;
    private final MessageListView messageListView;
    WebMarkupContainer messagesContainer = new WebMarkupContainer("feedbackul") {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onConfigure() {
            super.onConfigure();
            setVisible(anyMessage());
        }
    };


    public CustomFeedbackPanel(final String id) {
        this(id, null);
    }


    public CustomFeedbackPanel(final String id, IFeedbackMessageFilter filter) {
        super(id);

        add(messagesContainer);
        messageListView = new MessageListView("messages");
        messagesContainer.add(messageListView);

        if (filter != null) {
            setFilter(filter);
        }
    }

    public final boolean anyErrorMessage() {
        return anyMessage(FeedbackMessage.ERROR);
    }

    public final boolean anyMessage() {
        return anyMessage(FeedbackMessage.UNDEFINED);
    }

    public final boolean anyMessage(int level) {
        List<FeedbackMessage> msgs = getCurrentMessages();

        for (FeedbackMessage msg : msgs) {
            if (msg.isLevel(level)) {
                return true;
            }
        }

        return false;
    }

    public final FeedbackMessagesModel getFeedbackMessagesModel() {
        return (FeedbackMessagesModel) messageListView.getDefaultModel();
    }

    public final IFeedbackMessageFilter getFilter() {
        return getFeedbackMessagesModel().getFilter();
    }

    public final CustomFeedbackPanel setFilter(IFeedbackMessageFilter filter) {
        getFeedbackMessagesModel().setFilter(filter);
        return this;
    }

    public final Comparator<FeedbackMessage> getSortingComparator() {
        return getFeedbackMessagesModel().getSortingComparator();
    }

    public final CustomFeedbackPanel setSortingComparator(Comparator<FeedbackMessage> sortingComparator) {
        getFeedbackMessagesModel().setSortingComparator(sortingComparator);
        return this;
    }

    @Override
    public boolean isVersioned() {
        return false;
    }

    public final CustomFeedbackPanel setMaxMessages(int maxMessages) {
        messageListView.setViewSize(maxMessages);
        return this;
    }

    protected String getCSSClass(final FeedbackMessage message) {
        String css = "feedback";
        if (message.getLevel() == FeedbackMessage.ERROR
                || message.getLevel() == FeedbackMessage.FATAL) {
            css = "feedback error";
        }
        if (message.getLevel() == FeedbackMessage.SUCCESS) {
            css = "feedback success";
        }
        if (message.getLevel() == FeedbackMessage.WARNING) {
            css = "feedback warn";
        }

        return css;
    }

    protected final List<FeedbackMessage> getCurrentMessages() {
        final List<FeedbackMessage> messages = messageListView.getModelObject();
        return Collections.unmodifiableList(messages);
    }

    protected FeedbackMessagesModel newFeedbackMessagesModel() {
        return new FeedbackMessagesModel(this);
    }

    protected Component newMessageDisplayComponent(String id, FeedbackMessage message) {
        Serializable serializable = message.getMessage();
        Label label = new Label(id, (serializable == null) ? "" : serializable.toString());
        label.setEscapeModelStrings(CustomFeedbackPanel.this.getEscapeModelStrings());
        //label.add(new AttributeModifier("class",getCSSClass(message)));
        return label;
    }

    private final class MessageListView extends ListView<FeedbackMessage> {
        private static final long serialVersionUID = 1L;

        public MessageListView(final String id) {
            super(id);
            setDefaultModel(newFeedbackMessagesModel());
        }

        @Override
        protected IModel<FeedbackMessage> getListItemModel(
                final IModel<? extends List<FeedbackMessage>> listViewModel, final int index) {
            return new AbstractReadOnlyModel<FeedbackMessage>() {
                private static final long serialVersionUID = 1L;


                @Override
                public FeedbackMessage getObject() {
                    if (index >= listViewModel.getObject().size()) {
                        return null;
                    } else {
                        return listViewModel.getObject().get(index);
                    }
                }
            };
        }

        @Override
        protected void populateItem(final ListItem<FeedbackMessage> listItem) {
            final FeedbackMessage message = listItem.getModelObject();
            message.markRendered();
            final Component label = newMessageDisplayComponent("message", message);
            final AttributeModifier levelModifier = AttributeModifier.replace("class",
                    getCSSClass(message));
            //label.add(levelModifier);
            listItem.add(levelModifier);
            listItem.add(label);
            messagesContainer.add(levelModifier);

        }


    }
}

您应该考虑getCssClass()方法的主要内容。您可以根据您的要求进行更改。我已修改仅供您参考。

   protected String getCSSClass(final FeedbackMessage message) {
            String css = "feedback";
            if (message.getLevel() == FeedbackMessage.ERROR
                    || message.getLevel() == FeedbackMessage.FATAL) {
                css = "alert error";
            }
            if (message.getLevel() == FeedbackMessage.SUCCESS) {
                css = "alert success";
            }
            if (message.getLevel() == FeedbackMessage.WARNING) {
                css = "alert warn";
            }

            return css;
        }
于 2017-12-04T03:31:24.060 回答
0

反馈消息按FeedbackPanel班级呈现。似乎您的应用程序使用了FeedbackPanel 的自定义实现,将消息呈现为引导警报。

默认情况下,Wicket 将feedbackMessage<LogLevel>(例如feedbackMessageWarning)设置为所有消息的 CSS 类,因此您可以根据需要设置它们的样式。

于 2017-12-01T19:32:08.273 回答
0

不创建自定义 FeedbackPanel 和新 HTML/Java 文件的替代方法是使用附件

使用 Twitter 引导类:

<wicket:enclosure>
    <div class="alert alert-danger alert-dismissible">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
        <h4><i class="icon fa fa-ban"></i> Error on form validation!</h4>
        <div wicket:id="errorMessages"></div>
    </div>
</wicket:enclosure>

在页面构造函数中:

FeedbackCollector collector = new FeedbackCollector(this);
ExactErrorLevelFilter errorFilter = new ExactErrorLevelFilter(FeedbackMessage.ERROR);

add(new FeedbackPanel("errorMessages", errorFilter) {
    @Override public boolean isVisible() {
        return !collector.collect(errorFilter).isEmpty();
    }
});

由于 Wicket 6 反馈消息附加到组件,因此您可以使用FeedbackCollector和过滤器来获取和显示所需的消息。外壳的优点是:

  • 您不需要创建新文件;
  • 它的工作原理类似于片段/面板;
  • 仅在存在所需消息时才呈现;

希望能帮助到你。

于 2018-01-29T08:23:43.180 回答