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