如何在 Wicket Sessions 中配置反馈消息的颜色?

How can I configure the color of the feedback messages in Wicket Sessions?

问题

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

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

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

如有任何帮助,我们将不胜感激!

反馈消息由 FeedbackPanel class 呈现。您的应用程序似乎使用了 FeedbackPanel 的自定义实现,将消息呈现为 Bootstrap 警报。

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

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

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()方法。您可以根据您的情况进行更改requirement.I 已修改仅供您参考。

   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;
        }

不创建自定义反馈面板和新 HTML/Java 文件的替代方法是使用 enclosures:

使用 Twitter Bootstrap 类:

<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 和过滤器来获取和显示所需的消息。围栏的优点是:

  • 您不需要创建新文件;
  • 它的工作原理类似于 fragments/panels;
  • 只有在需要的消息存在时才会呈现;

希望对您有所帮助。