各位高手:(放在javascript版块没有结果,实不得已) 比如有两个表格,每个表格的大小是12 × 16 ,即列为12,行为16。这个表格上面会被放上一个一个的div,每个div大小不等,div最小可为1×1,最大可为12×16。两张表格上面可能会有一个div,可能会放满,也可能一个都没有。现在我想把外面的div放置在这张表格的空白位置,想算出这两张表格中能放下这个div的空白位置。
/*
所要放置div的大小最小为1×1,最大为12×16。
两个table左右排列。
*/
规则:
1. 如果两个table一个div都没有,则根据所给div的大小放置在左边的表格空白处。
2. 表格能够放下div的剩余空白位置必须是连续的。
3. 如果有可用的空白位置,最好能和原有的div并列放置或上下放置,即和原来div的边线紧贴着排列。我现在做的是两个表格之间div的拖动,拖动功能已经实现了。现在想双击表格之外的div自动跑到表格中的空白位置中。请大家多多帮忙,用java写也可以,不需要牵涉到html或者dom,希望能够给出一个完整的算法程序,感谢不尽!!!!!
/*
所要放置div的大小最小为1×1,最大为12×16。
两个table左右排列。
*/
规则:
1. 如果两个table一个div都没有,则根据所给div的大小放置在左边的表格空白处。
2. 表格能够放下div的剩余空白位置必须是连续的。
3. 如果有可用的空白位置,最好能和原有的div并列放置或上下放置,即和原来div的边线紧贴着排列。我现在做的是两个表格之间div的拖动,拖动功能已经实现了。现在想双击表格之外的div自动跑到表格中的空白位置中。请大家多多帮忙,用java写也可以,不需要牵涉到html或者dom,希望能够给出一个完整的算法程序,感谢不尽!!!!!
解决方案 »
- 图片读写系统找不到指定文件
- 实习了三个月java了,感觉很迷茫
- 高分请教高手一个多线程的问题。。现在等
- java数据库里日期2006-06-19 16:20:12,为什么取出2006-06-19 16:20:12.0
- 我的程序在内存中制作了html源码(不存在这个文件),可以调用IE打开这个html吗?
- Help. BufferedImage.getGraphics Failed
- j2eesdk 1.4在win2000下,如何对j2sdk的环境设置?(在线等喔!谢谢!)
- java+db2,遇到取数据的简单问题!请教
- 怎样用javascript在table中生成新的一行?
- 如何通过jdbc将文件放到数据库里?
- 关于主函数入口的参数
- jdbc 基础
*class AutoFillDivs该类纯粹是为了演示,只有注释//used的代码才与LZ要求有关
*/
import java.io.* ;
import java.util.* ;
public class AutoFillDivs extends javax.swing.JFrame {
Table tLeft = null; //used
Table tRight =null; //used
public AutoFillDivs() {
tLeft = new Table(0,0,12,16) ; //used
tRight = new Table(20,0,12,16) ; //used
}
public static void main(String args[]){
double width ;
double height ;
boolean quitFlag = false ;
String lastLine ="" ;
BufferedReader stdin = null ;
StringBuffer sb = new StringBuffer() ;
AutoFillDivs af = new AutoFillDivs() ;
System.out.println("请输入要自动添加的div的宽和高,用逗号分开写如: 4,6 \n输入exit来退出.输入list来列举已填充进取的DIV.");
while (!quitFlag){
try{
stdin = new BufferedReader( new InputStreamReader(System.in));
lastLine = stdin.readLine() ;
}catch (IOException e){
e.printStackTrace();
}
if (lastLine.trim().toLowerCase().equals("exit".toLowerCase())) {
quitFlag = true ;
System.out.println("再见!");
System.exit(0);
}
if (lastLine.trim().toLowerCase().equals("list".toLowerCase())) {
af.listAllDivs();
}
if (lastLine.split(",").length==2 && !lastLine.split(",")[0].equals("") && !lastLine.split(",")[1].equals("") ){//used
width = Double.parseDouble(lastLine.split(",")[0]);//used
height = Double.parseDouble(lastLine.split(",")[1]);//used if (width > 0.0f && height > 0.0f){//used
Div div = new Div(width , height) ;//used
if (af.tLeft.add(div)){//used
System.out.println("新的div块已被加到左边的Table");
}else if (af.tRight.add(div)){//used
System.out.println("新的div块已被加到右边的Table");
}else{//used
System.out.println("两个Table都无再容下这个Div了");
}
} else{
System.out.println("请保证两个参数都大于0");
}
}else{
System.out.println("请输入两个参数并用逗号隔开");
}
}
}
private void listAllDivs(){
System.out.println("==================================================");
System.out.println("现在正在输出左边的Table");
Iterator it = tLeft.alDivs.iterator() ;
while (it.hasNext()){
System.out.println(((Div)it.next()).toString());
}
System.out.println("==================================================");
System.out.println("现在正在输出右边的Table");
it = tRight.alDivs.iterator() ;
while (it.hasNext()){
System.out.println(((Div)it.next()).toString());
}
System.out.println("==================================================");
}
}/**
*Class Div 代表Div ,
*/
public class Div { double x; //左顶点x
double y; //左顶点y
double width;
double height;
private boolean state ;//判断这个div是否有效如果width或者height有一个小于0就无效
Div (double aX, double aY, double aWidth, double aHeight){
this.x = aX ;
this.y = aY ;
this.width = aWidth ;
this.height = aHeight ;
state = (aWidth <=0 || aHeight<=0) ? false :true ;
}
Div(double aWidth , double aHeight){
this.width = aWidth ;
this.height = aHeight ;
state = (aWidth <=0 || aHeight<=0) ? false :true ;
}
public boolean isValidity(){ //返回有效性
return state ;
}
public boolean contains (Div aDiv) { //判断一个div是否包含另一个div
if (this.contains(aDiv.x ,aDiv.y)
&& (aDiv.width+aDiv.x < this.width + this.x)
&& (aDiv.height+aDiv.y < this.height + this.y) ){
return true ;
}
return false ;
}
private boolean contains (double x, double y) { //判断一个div是否包含一个点
return (x >= this.x) && (y >= this.y) && ((x - this.x) < width) && ((y - this.y) < height);
}
public String toString(){
return "DIV 顶点坐标:(" + x +","+y+") 宽度:"+width+" 高度:" + height ;
} }/**
*Class Table 代表Table
*/import java.util.*;public class Table {
Div theDiv = null; //一个table它的内部区域可以认为是一个div Table (double aX, double aY, double aWidth, double aHeight){
theDiv = new Div(aX, aY, aWidth, aHeight) ;
alUnused.add(this.theDiv) ; //初始化可使用区
} List alDivs = new ArrayList() ; //存储这个table到底已经填加了多少div
List alUnused = new ArrayList() ; //存储这个table还有多少个长方形形状Div可供填充
/**
*这个方法是用来测试当前table是否可以把一个div添加进去,这个div只需要初始化
*width和height就可以了。具体实现原理是:从存储的可供填充的div依次与要填充的div进行比较,
*这里需要注意的是,当前仅仅在第一次找到符合条件的DIV区域时就停止了,如果要控制div填充位置
*的优先级,比如优先考虑在左上位置的符合条件的DIV区域,需要把所有符合条件的都挑出来,然后
*比较它们的x,y坐标即可。
*/
public boolean add(Div aDiv){
Iterator it = alUnused.iterator() ;
Div tempDiv = null ;
while (it.hasNext()){
tempDiv = (Div)it.next() ;
//调用辅助方法addUnusedPart来具体判断一个div是不是能够放到另一个div里。
if ( this.addUnusedPart( tempDiv, aDiv ) ){
alDivs.add(aDiv) ; //如果可以,就把新的div存储起来。
alUnused.remove(tempDiv ); //要及时把被用掉div区域从alUnused remove掉
return true ;
}
}
return false ;
} /**
*这个方法是个辅助方法,具体来判断一个div是不是能够放到另一个div里。如果不是就返回false
*如果是,就把一个大长方形和一个小长方取反后的区域分成三个长方div块,并存alUnused中去。
*每放入一个div就会产生三个新的div区域供以后使用,除非两个div刚好一样
* --------
*|去 | 留|
*|---|---|
*|留 | 留|
*---------
*/
private boolean addUnusedPart(Div unused , Div aDiv){
aDiv.x = unused.x ;
aDiv.y = unused.y ;
Div temp = null;
//首先要确保要比较的div块有效,并且大的包含小的。
if (unused.isValidity() && aDiv.isValidity() && unused.contains(aDiv)){
temp = new Div( aDiv.x +aDiv.width , aDiv.y ,unused.width - aDiv.width , aDiv.height );
if (temp.isValidity()) alUnused.add(temp) ;
temp = new Div( aDiv.x , aDiv.y + aDiv.height ,aDiv.width , unused.height - aDiv.height );
if (temp.isValidity()) alUnused.add(temp) ;
temp = new Div( aDiv.x +aDiv.width , aDiv.y + aDiv.height ,unused.width - aDiv.width , unused.height - aDiv.height );
if (temp.isValidity()) alUnused.add(temp) ;
temp = null ;
return true ;
}
return false ;
}
}
表格能够放下div的剩余空白位置必须是连续的?