【问题标题】:How can I configure the color of the feedback messages in Wicket Sessions?如何在 Wicket Sessions 中配置反馈消息的颜色?
【发布时间】:2017-12-01 17:10:50
【问题描述】:

问题

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

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: wicket wicket-7


    【解决方案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;
            }
    

    【讨论】:

    • 感谢您的回答 - 我在项目中找到了一个已经存在的 FeedbackPanel 自定义实现,并修改了 getCssClass() - 方法。
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢您的回答!它非常有用,我在阅读后立即找到了自定义的 FeedbackPanel 实现。
    【解决方案3】:

    不创建自定义反馈面板和新 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 和过滤器来获取和显示所需的消息。外壳的优点是:

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多