从Java创建HTML表,检查TD是否已经在它的右边有一个TD

从Java创建HTML表,检查TD是否已经在它的右边有一个TD,java,html,css,gagawa,Java,Html,Css,Gagawa,我正在使用Gagawa()库动态创建一个HTML表,以显示学校每周的课程表。问题是,因为我使用rowspan根据课程的持续时间来增加单元格的大小,例如,当我尝试添加在MWF上相遇的课程时,该行的典型布局是 …内容。。。内容。。。内容… 但是,如果2个课程在时间上重叠但在不同的日子,插入空白 元素被强制向右,因为在下一列中已经存在另一个课程的代码> 。请参阅附带的屏幕截图以了解更多说明(我在其上绘制了红色箭头,以显示正确的布局;ANT210.101应位于MWF上,但我尝试在第一个ANT220.10

我正在使用Gagawa()库动态创建一个HTML表,以显示学校每周的课程表。问题是,因为我使用rowspan根据课程的持续时间来增加单元格的大小,例如,当我尝试添加在MWF上相遇的课程时,该行的典型布局是

…内容。。。内容。。。内容…

<>但是,如果2个课程在时间上重叠但在不同的日子,插入空白<代码> <代码>元素被强制向右,因为在下一列中已经存在另一个课程的代码> <代码>。请参阅附带的屏幕截图以了解更多说明(我在其上绘制了红色箭头,以显示正确的布局;ANT210.101应位于MWF上,但我尝试在第一个ANT220.102的下半部分阻止它的位置插入一个空白的
,因此它被放在它的右侧)

我要么需要一种方法来动态地检测是否放入空白<代码> <代码>,或者使之成为正确的方法,而不是向右移动,它会向下移动(也许在CSS中有这样的方法) 下面是我动态生成HTML表的代码:

public String generateHTMLScheduleTable(Schedule s){
        Table scheduleTable=new Table();
        scheduleTable.setCSSClass("scheduleTable");
        Tr dayRow=new Tr();
        Th time=new Th(); time.appendText("Time");
        Th mon=new Th(); mon.appendText("Monday");
        Th tue=new Th(); tue.appendText("Tuesday");
        Th wed=new Th(); wed.appendText("Wednesday");
        Th th=new Th(); th.appendText("Thursday");
        Th fri=new Th(); th.appendText("Friday");
        dayRow.appendChild(time, mon, tue, wed, th, fri);       
        TreeMap<Integer, String> colors=mapCoursesToColors(s);

        String[] days={"m", "t", "w", "r", "f"};

        for(int j=8; j<=22; j++){
            int timeInt=j%12;
            if(timeInt==0){
                timeInt=12;
            }
            String timeHr="" + timeInt;

            //System.out.println(timeHr);

            String amPm;
            if(j>11){
                amPm="PM";
            }
            else{
                amPm="AM";
            }
            for(int k=0; k<2; k++){
                String timeMin="";
                if(k==0){
                    timeMin="00";

                }
                else{
                    timeMin="30";
                }
                Tr currRow=new Tr();
                Td currCell=new Td();
                currCell.appendText(timeHr + ":" + timeMin + amPm);
                currRow.appendChild(currCell);

                for(int i=0; i<days.length; i++){
                    Td newCell=new Td();
                    for(Course c : s.getCourses()){
                        if((c.getTime().substring(0, c.getTime().indexOf(':')).equals(timeHr) || c.getTime().substring(0, c.getTime().indexOf(':')).equals("0" + timeHr)) && c.getTime().substring(0, c.getTime().indexOf('-')).contains(timeMin) && c.getTime().substring(0, c.getTime().indexOf('-')).contains(amPm)){
                            if(c.getDays().toLowerCase().contains(days[i])){
                                String currentColor=colors.get(c.getCRN());
                                String timeLastHalf=c.getTime().substring(c.getTime().indexOf('-')+1);
                                int startHr=Integer.parseInt(timeHr);
                                int endHr=Integer.parseInt(timeLastHalf.substring(0, timeLastHalf.indexOf(':')));
                                int numCells=endHr-startHr;
                                numCells=numCells*2;
                                if(!c.getTime().substring(0, c.getTime().indexOf('-')).contains("00")){
                                    if(timeLastHalf.contains("00")){
                                        numCells=numCells-1;
                                    }
                                }
                                else{
                                    if(!timeLastHalf.contains("00")){
                                        numCells=numCells+1;
                                    }
                                }
                                if(numCells<2){
                                    numCells=2;
                                }
                                newCell.setBgcolor(currentColor);
                                newCell.setRowspan("" + numCells);
                                newCell.appendText(c.getTitle());
                                newCell.appendChild(new Br());
                                newCell.appendText(c.getCourseAndSection());
                                newCell.appendChild(new Br());
                                newCell.appendText(c.getTime());
                                Input submit=new Input();
                                submit.setType("submit");
                                submit.setCSSClass("btn");
                                submit.setName("" + c.getCRN());
                                submit.setValue("Remove");
                                Input moreInfo=new Input();
                                moreInfo.setType("submit");
                                moreInfo.setCSSClass("btn");
                                moreInfo.setName(c.getCRN() + "View");
                                moreInfo.setValue("More Info");
                                newCell.appendChild(new Br());
                                newCell.appendChild(submit);
                                newCell.appendChild(moreInfo);
                            }
                        }
                    }
                    currRow.appendChild(newCell);
                }
                scheduleTable.appendChild(currRow);
            }
        }
        String html=scheduleTable.write();
        System.out.println(html);

        return html;
    }
公共字符串generateHTMLScheduleTable(附表s){
表scheduleTable=新表();
setCSSClass(“可调度”);
Tr dayRow=新Tr();
Th time=new Th();time.appendText(“time”);
Th mon=新Th();mon.appendText(“星期一”);
星期二=新的星期二;
星期三=新的星期三;
Th Th=新Th();Th.附录文本(“星期四”);
Th fri=新Th();Th.附录文本(“星期五”);
dayRow.child(时间,周一、周二、周三、日、周五);
树贴图颜色=贴图颜色;
字符串[]天={“m”、“t”、“w”、“r”、“f”};
用于(int j=8;j11){
amPm=“PM”;
}
否则{
amPm=“AM”;
}

对于(int k=0;k我不认为我真的理解你的问题,但我的建议如下:

请看

您可以从这些建议的代码中选择要使用的代码。将它/它们插入到您认为应该放置的代码中,可以是在显示表格之后,也可以是在显示期间

搜索单个/集合或集合元素,将返回一个对象/数组。

$td = $html->find("td", 0);

if (is_object($td)) {
    //code here
}
if($html->find("td", 0)) {
    //code here
}else{
    //code here
}
同上,但方式不同。

$td = $html->find("td", 0);

if (is_object($td)) {
    //code here
}
if($html->find("td", 0)) {
    //code here
}else{
    //code here
}
或者您也可以查看给定的每个方法的逻辑(询问OP是否可以,他只需要伪代码) 检查TD右侧是否已经有TD是错误的方法

正确的方法是防止空td上面有行跨度占用,从而防止推出下一个插入的td。“简单地说,始终保持数字td始终正确” 您的编码很好您需要做的就是每天添加一个计数器,如果有五个计数器(因为您在Q中的示例中说过),然后使用此计数器遍历由于上面的行间距分配而占用的空间,并在结束时跟踪它,然后在该列下应用空td

Column_count是用于跟踪行中列的当前位置的变量

接下来是5个超低指示器,用于指示5列及其溢出状态。既然您说每行表示30分钟,那么您查找tr中是否必须开始一小时的逻辑是查找开始时间是否等于导致30分钟增量的每行更改相关时间的计数器

在解释中,溢出_X用于每个单独的变量名

  • 首先,我们需要事先知道外部for循环将有多少行,因为它是留给u的
  • 现在使用逻辑优先,我们每天使用switch语句
  • 现在,首先在案例中,我们检查溢出X计数是否大于零,这是为了理解是否需要插入类详细信息,或者大于零意味着它是由上面的行span分配的,其默认值将为-1。我将解释为什么
  • 溢出变量的默认值设置为-1,因为每次添加行跨度2或其倍数(取决于)时,都会添加一个td,并将其值增加2。因此,在for的下一次迭代中,会检查它,如果小于零,则检查它 它不会插入新的td,而是转到else案例并减小该值
  • 通过这种方式,我们绕过了添加空白td并导致td向右推的机会
  • 因此,这里我们只在上面没有行跨度分配时插入一个空白td
  • 检查下面的_X是否为零,然后将其设置为-1,因为2n-1行跨度已被覆盖
  • 溢出变量在迭代中使用,如果它显示了星期四的溢出流增加了2。因此,当开关进入下一行时,当它进入星期二的情况4时,它检查是否有溢出,如果是,那么溢出流被递减。因此,在这里避免了TD的空白插入,这将阻止TD FRO。I’我要打破这条河

    td{
    边框:1px纯黑;
    }
    普希杜特先生{
    背景:红色;
    }
    .欺负{
    背景:蓝色;
    颜色:白色
    }
    此处,上下的值_Col2=1(-1+2)
    资料
    推
    资料
    这里的Overlow_Col2=-的值在递减后为零,然后将其压缩到-1,使其恢复正常,但是如果没有这样的变量来跟踪它,那么它将导致以下情况
    资料
    推
    资料
    由于无法跟踪前一行的td而被推出
    
    我认为您可以使用另一种方法,制作独立的列,如下面的HTML示例。您的内容将按列添加,并根据时间/持续时间设置行高。我尝试了这个方法