说来话长。我只是想做一个通讯录,其中一块是想在一个面板上显示我从数据库中读出来的数据。
一行一行写的话,一屏幕可能撑不下,然后就看书,用了ScrollPane
书上说,ScrollPane只能存放一个容器(Panel),所以我就把我的数据逐项让如这个Panel再显示出来
但是我从网上查了半天才知道,因为放进了ScrollPane,这个Panel的布局只能是FlowLayout\GridLayout
问题在于FlowLayout没有多大意义,而GridLayout在这里用起来太不正常了,听我给你们慢慢道来...如果按照实际实际数据项的数目来设置GridLayout的格数,如果数据项比较大,超出屏幕的话显示是正确的,如下图但是如果数据项的数据太少,这么显示就不合适了,如下图于是针对这种情况我想采用一种这种的办法
判断一屏放满的话应该可以放多少行,如果要显示的数据行大于整个数据就不管了
如果要显示的数据行小于这个数据,就用放满屏的行数的小的Panel先充满整个屏
然后再把数据显示在靠上的若干个小的Panel中,从而比较紧凑
问题在这里就出现了
它不是一个竖行显示先来,而是显示成了横着的,然后排满后再横排到第二行
注:本来有数据的项应该用TextField;没有显示数据的小Panel,用无文本的Label,来表示空白的下方区域。但实验阶段,为省事,全部临时用的TextField。
另外我用的是GridLayout(n,1)即只有一列,只要添加数据行肯定在下一行。我的部分代码:
                  rs=stmt.executeQuery(sql);//查询数据库
     rs.last();//走到查出数据集的最后一行
     rowNum=rs.getRow();//获取数据的行数
     GridLayout gd=new GridLayout(rowNum+1,1);//定义成grid布局
     this.setLayout(gd);//用GridLayout布局
    
     Toolkit tool=getToolkit(); 
                Dimension dim=tool.getScreenSize();//获取屏幕的大小
                fullNum=dim.height/iheight;//获取充满屏幕可能的行数,iheight是行高
                rs.first();rs.beforeFirst();//走回第一条数据项之前
    
     rowLabel rl=new rowLabel("姓名","手机");
     add(rl);
            if(rowNum<fullNum){//数据不够一屏,就先装满一屏
             rp=new rowPanel[fullNum];//生成满屏那么多的小Panel
             ynum=0;
             while(ynum<fullNum){
         rp[ynum]=new rowPanel("","");//每一行的面板都先为空的,下面再给TextField赋值。
         //注:rowPanel是我另外的写的类,无非是extends Panel,然后在里面放几个的TextField
          add(rp[ynum]);
         ++ynum;
        
         }
            }//
             else {//超过一屏,按实际数据的行数显示。内容同上。
             rp=new rowPanel[rowNum+1];
             ynum=0;
             while(ynum<rowNum){
            
         rp[ynum]=new rowPanel("","");//我自己定义的可以显示一行数据的窄面板
        
          add(rp[ynum]);
         ++ynum;
             }
            
            }
            ynum=0;
            while(ynum<rowNum){//对于把查出的数据集,重新显示数据在前若干个小米面板上。
     rs.next();
     rp[ynum].rowPset(rs.getString(1),rs.getString(2));//面板
     ++ynum;
    
     }另:我写的rowPanel类,可看可不看
import java.awt.*;
public class rowPanel extends Panel {
int ix=0,iy=0,iheight=20;
int iname=40;
int iphone=80;
int rowNum,fullNum;
int xnum=0,ynum=0;
TextField t1,t2;
rowPanel(String s1,String s2){
this.setBounds(ix, iy, iname*20, iheight);
this.setLayout(null);
//this.setBackground(Color.red);

t1=new TextField(s1);//姓名文本框
add(t1);
t1.setBounds(ix, iy, iname, iheight);


t2=new TextField(s2);//手机号文本框
add(t2);
t2.setBounds(ix+iname, iy, iphone, iheight);
validate();
}
void rowPset(String a1,String a2){
t1.setText(a1);//姓名文本框
t2.setText(a2);//手机文本框

}
}

解决方案 »

  1.   

    上面的那段程序格式有点乱,也不知道怎么修改
    重新写一下
    rs=stmt.executeQuery(sql);//查询数据库
    rs.last();//走到查出数据集的最后一行
    rowNum=rs.getRow();//获取数据的行数GridLayout gd=new GridLayout(rowNum+1,1);//定义成grid布局
    this.setLayout(gd);//用GridLayout布局
        
    Toolkit tool=getToolkit(); 
    Dimension dim=tool.getScreenSize();//获取屏幕的大小
    fullNum=dim.height/iheight;//获取充满屏幕可能的行数,iheight是行高
    rs.first();rs.beforeFirst();//走回第一条数据项之前
        
    rowLabel rl=new rowLabel("姓名","手机");
    add(rl);
    if(rowNum<fullNum){//数据不够一屏,就先装满一屏
        rp=new rowPanel[fullNum];//生成满屏那么多的小Panel
        ynum=0;
        while(ynum<fullNum){
            rp[ynum]=new rowPanel("","");//每一行的面板都先为空的,下面再给TextField赋值。
            //注:rowPanel是我另外的写的类,无非是extends Panel,然后在里面放几个的TextField
            add(rp[ynum]);
            ++ynum;
        }
    }//
    else {//超过一屏,按实际数据的行数显示。内容同上。
        rp=new rowPanel[rowNum+1];
        ynum=0;
        while(ynum<rowNum){            
            rp[ynum]=new rowPanel("","");//我自己定义的可以显示一行数据的窄面板
            add(rp[ynum]);
            ++ynum;
        }            
    }
    ynum=0;
    while(ynum<rowNum){//对于把查出的数据集,重新显示数据在前若干个小米面板上。
         rs.next();
         rp[ynum].rowPset(rs.getString(1),rs.getString(2));//面板
         ++ynum;
        
    }
      

  2.   

    那楼上的兄弟给说说撒,为什么用了gridlayout,不按gridlayout显示呢
      

  3.   

    你这种情况 用Swing,ScrollPane里面放JTable最合适不过了......哪需要一个Panel一个Panel这样去加啊......
      

  4.   

    错..应该是JScrollPane里面放JTable
      

  5.   

    同意楼上.
    放jtable显示就挺好的.