Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 隐藏瓦丁日历的小时数轴_Java_Calendar_Vaadin - Fatal编程技术网

Java 隐藏瓦丁日历的小时数轴

Java 隐藏瓦丁日历的小时数轴,java,calendar,vaadin,Java,Calendar,Vaadin,我需要在水平方向图的视图中显示多个日历。由于日历彼此绑定,我只想显示左侧第一个日历的小时轴 可能吗 更新:这是我的代码的当前版本。这很简单,只需在固定循环中创建日历。。。代码在我视图的构造函数中 private List<Calendar> listOfCals = new ArrayList<>(); public PostageViewAsManyCalendars() { root.setMargin(true); int hour = 6;

我需要在水平方向图的视图中显示多个日历。由于日历彼此绑定,我只想显示左侧第一个日历的小时轴

可能吗

更新:这是我的代码的当前版本。这很简单,只需在固定循环中创建日历。。。代码在我视图的构造函数中

private List<Calendar> listOfCals = new ArrayList<>();

public PostageViewAsManyCalendars() {

    root.setMargin(true);

    int hour = 6;
    for (int i = 0; i < 10; i++) {
        Calendar cal = new Calendar("My Calendar");
        cal.setWidth("150px");
        cal.setHeight("400px");
        listOfCals.add(cal);

        cal.setStartDate(new GregorianCalendar(2012, 1, 14, 00, 00).getTime());
        cal.setEndDate(new GregorianCalendar(2012, 1, 14, 23, 59).getTime());

        // Use a container of built-in BasicEvents
        final BeanItemContainer<BasicEvent> container = new BeanItemContainer<BasicEvent>(BasicEvent.class);

        // Create a meeting in the container
        container.addBean(
                new BasicEvent("The Event", "Single Event", new GregorianCalendar(2012, 1, 14, hour, 00).getTime(),
                        new GregorianCalendar(2012, 1, hour + 3, 14, 00).getTime()));

        // The container must be ordered by the start time. You
        // have to sort the BIC every time after you have added
        // or modified events.
        container.sort(new Object[] { "start" }, new boolean[] { true });
        cal.setContainerDataSource(container, "caption", "description", "start", "end", "styleName");

        root.addComponent(cal);
        hour++;
    }

    this.setCompositionRoot(root);
}
private List listOfCals=new ArrayList();
公共邮政视图asmanyCalendars(){
root.setMargin(真);
整小时=6;
对于(int i=0;i<10;i++){
Calendar cal=新日历(“我的日历”);
校准设定宽度(“150px”);
校准设定高度(“400px”);
目录。添加(cal);
cal.setStartDate(新的GregorianCalendar(2012,1,14,00,00).getTime());
cal.setEndDate(新的GregorianCalendar(2012,1,14,23,59).getTime());
//使用内置基本通风口的容器
最终BeanItemContainer容器=新的BeanItemContainer(BasicEvent.class);
//在容器中创建会议
container.addBean(
新的BasicEvent(“事件”,“单一事件”,新的GregorianCalendar(2012,1,14,hour,00).getTime(),
新的GregoriaCalendar(2012,1,hour+3,14,00).getTime());
//必须在开始时间之前订购容器。您
//每次添加后都必须对BIC进行排序
//或修改事件。
sort(新对象[]{“开始”},新布尔值[]{true});
cal.setContainerDataSource(容器,“标题”、“说明”、“开始”、“结束”、“样式名”);
root.addComponent(cal);
小时++;
}
此.setCompositionRoot(根);
}
我想隐藏的是轴小时,如下所示:


基于css更改的技术是不够的。css类中的任何更改都将应用于所有日历,这对我来说并不好,因为我需要显示第一个日历的时间条

要测试该属性,请更改以下css类,如下所示:

.v日历时间{
宽度:0px;
字号:0.77em;
线高:1;
空白:nowrap;
溢出:隐藏;
颜色:透明;

}
最后,我成功地提出了一个基于Vaadin 7扩展机制的解决方案。Java扩展操作默认生成的DOM,并根据我想要的显示删除、修改或添加css类

最后,我得到以下视图,在本例中,该视图有4个日历:

有关Vaadin 7扩展的更多信息:

我的代码的主要部分是进行DOM转换的连接器类:

@连接(CalendarExtension.class) 公共类CalendarExtensionConnector扩展了AbstractExtensionConnector{

private static final long serialVersionUID = -8722803624865597642L;

private VCalendar vcalendar;

/*
 * (non-Javadoc)
 * @see com.vaadin.client.extensions.AbstractExtensionConnector#extend(com.vaadin.client.ServerConnector)
 */
@Override
protected void extend(ServerConnector target) {

    vcalendar = (VCalendar) ((ComponentConnector) target).getWidget();

    // I have tested many other handlers but does not work : AttachEvent.Handler, LoadHandler, InitializeHandler,
    // OpenHandler, ValueChangeHandler

    // weekGrid is a property in VCalendar, and it contains the famous TimeBar !
    target.addStateChangeHandler("weekGrid", new StateChangeEvent.StateChangeHandler() {
        private static final long serialVersionUID = -8439729365677484553L;

        @Override
        public void onStateChanged(StateChangeEvent stateChangeEvent) {
            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                @Override
                public void execute() {
                    Element element = vcalendar.getElement();

                    // add css classes
                    addClassName(element, getState().cssClasses2Add);

                    // set exact properties
                    setExactProperties4ExactClassName(element, getState().exactStyleProperties);

                    // remove elements
                    removeChildrenByClassName(element, getState().cssClasses4Remove);

                }

            });
        }
    });

}

/**
 * @param element
 * @param extProperties
 */
private void setExactProperties4ExactClassName(Element element, List<String> extProperties) {
    for (String prop : extProperties) {
        String[] props = prop.split(",");
        String class2Search = props[0];
        String propertyName = props[1];
        String propertyValue = props[2];
        List<Element> exacts = DomUtils.findElementsByExactClass(element, class2Search);
        if (exacts != null) {
            for (Element exa : exacts) {
                exa.getStyle().setProperty(propertyName, propertyValue);
            }
        }
    }
}

private void addClassName(Element element, List<String> cssClasses2Add) {
    for (String prop : cssClasses2Add) {
        String[] props = prop.split(",");
        String class2Search = props[0];
        String class2Add = props[1];

        List<Element> exacts = DomUtils.findElementsByExactClass(element, class2Search);
        if (exacts != null) {
            for (Element exa : exacts) {
                exa.addClassName(class2Add);
            }
        }
    }
}

/**
 * @param element
 * @param className
 */
private void removeChildrenByClassName(Element element, String... classNames) {
    List<Element> items = DomUtils.findElementsForClass(element, classNames);
    if ((items != null) && (items.size() > 0)) {
        for (Element element2 : items) {
            element2.removeFromParent();
        }
    }
}

/*
 * (non-Javadoc)
 * @see com.vaadin.server.AbstractClientConnector#getState()
 */
@Override
public CalendarExtensionState getState() {
    return (CalendarExtensionState) super.getState();
}
private static final long serialVersionUID=-8722803624865597642L;
私人VCalendar VCalendar;
/*
*(非Javadoc)
*@请参阅com.vaadin.client.extensions.AbstractExtensionConnector#extend(com.vaadin.client.ServerConnector)
*/
@凌驾
受保护的无效扩展(ServerConnector目标){
vcalendar=(vcalendar)((ComponentConnector)目标).getWidget();
//我已经测试了许多其他处理程序,但都不起作用:AttachEvent.Handler、LoadHandler、InitializeHandler、,
//OpenHandler,ValueChangeHandler
//weekGrid是VCalendar中的一个属性,它包含著名的时间条!
target.addStateChangeHandler(“weekGrid”,new StateChangeEvent.StateChangeHandler()){
私有静态最终长serialVersionUID=-8439729365677484553L;
@凌驾
StateChanged上的公共无效(StateChangeEvent StateChangeEvent){
Scheduler.get().ScheduledDeferred(新的ScheduledCommand(){
@凌驾
public void execute(){
Element=vcalendar.getElement();
//添加css类
addClassName(元素,getState().cssclasse2add);
//设置精确属性
setExactProperties4ExactClassName(元素,getState().exactStyleProperties);
//删除元素
removeChildrenByClassName(元素,getState().cssclasse4Remove);
}
});
}
});
}
/**
*@param元素
*@param extProperties
*/
私有void setExactProperties4ExactClassName(元素,列表extProperties){
对于(字符串属性:extProperties){
字符串[]props=prop.split(“,”);
字符串class2Search=props[0];
字符串propertyName=props[1];
字符串propertyValue=props[2];
List exacts=DomUtils.findElementsByExactClass(元素,class2Search);
如果(精确!=null){
用于(元素exa:精确){
exa.getStyle().setProperty(propertyName,propertyValue);
}
}
}
}
私有void addClassName(元素元素,列表CSSClasse2Add){
用于(字符串属性:cssClasses2Add){
字符串[]props=prop.split(“,”);
字符串class2Search=props[0];
字符串class2Add=props[1];
List exacts=DomUtils.findElementsByExactClass(元素,class2Search);
如果(精确!=null){
用于(元素exa:精确){
例如,addClassName(class2Add);
}
}
}
}
/**
*@param元素
*@param className
*/
私有void removeChildrenByClassName(元素、字符串…类名){
List items=DomUtils.findElementsForClass(元素、类名);
如果((items!=null)&&(items.size()>0)){
用于(要素2:项目){
element2.removeFromParent();
}
}
}
/*
*(非Javadoc)
*@see com.vaadin.server.AbstractClientConnector#getState()
*/
@凌驾
公共日历扩展状态getState(){
return(CalendarExtensionState)super.getState();
}
}

我的想法很简单:

public class DomUtils {

public static List findElementsForClass(Element element, String... classNames) {
    ArrayList result = new ArrayList();
    recElementsForClass(result, element, classNames);
    return result;
}

private static void recElementsForClass(ArrayList res, Element element, String... classNames) {
    String c;

    if (element == null) {
        return;
    }

    c = DOM.getAttribute(element, "className");

    if (c != null) {
        String[] p = c.split(" ");

        for (String element2 : p) {
            for (String className : classNames) {
                if (element2.equals(className)) {
                    res.add(element);
                }
            }
        }
    }

    for (int i = 0; i < DOM.getChildCount(element); i++) {
        Element child = DOM.getChild(element, i);
        recElementsForClass(res, child, classNames);
    }
}

public static List findElementsByExactClass(Element element, String className) {
    ArrayList result = new ArrayList();
    recElementsForExactClass(result, element, className);
    return result;
}

private static void recElementsForExactClass(ArrayList res, Element element, String className) {
    String c;

    if (element == null) {
        return;
    }

    c = DOM.getAttribute(element, "className");

    if (c != null) {
        if (c.equals(className)) {
            res.add(element);
        }
    }

    for (int i = 0; i < DOM.getChildCount(element); i++) {
        Element child = DOM.getChild(element, i);
        recElementsForExactClass(res, child, className);
    }
}
公共类域{
公共静态Lis