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