欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Swing组件编程之JTable表格用法实例详解

程序员文章站 2024-04-01 19:56:46
本文实例讲述了java swing组件编程之jtable表格用法。分享给大家供大家参考,具体如下: 表格是gui编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示...

本文实例讲述了java swing组件编程之jtable表格用法。分享给大家供大家参考,具体如下:

表格是gui编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示二维数据,提供编辑,选择等功能。如果只是显示数据,这还是非常easy的,只要在jtable中传入二维数组或集合就可以了。

示例1:

package awtdemo;
import javax.swing.jframe;
import javax.swing.jscrollpane;
import javax.swing.jtable;
public class simpletable
{
  jframe jf = new jframe("简单表格 - www.jb51.net");
  jtable table;
  //定义二维数组作为表格数据
  object[][] tabledata =
  {
    new object[]{"李清照" , 29 , "女"},
    new object[]{"苏格拉底", 56 , "男"},
    new object[]{"李白", 35 , "男"},
    new object[]{"弄玉", 18 , "女"},
    new object[]{"虎头" , 2 , "男"}
  };
  //定义一维数据作为列标题
  object[] columntitle = {"姓名" , "年龄" , "性别"};
  public void init()
  {
    //以二维数组和一维数组来创建一个jtable对象
    table = new jtable(tabledata , columntitle);
    //将jtable对象放在jscrollpane中,并将该jscrollpane放在窗口中显示出来
    jf.add(new jscrollpane(table));
    jf.pack();
    jf.setdefaultcloseoperation(jframe.exit_on_close);
    jf.setvisible(true);
  }
  public static void main(string[] args)
  {
    new simpletable().init();
  }
}

运行效果:

Java Swing组件编程之JTable表格用法实例详解

下面举个jtable表格调整和选择方式的例子。

示例2:

package awtdemo;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import javax.swing.buttongroup;
import javax.swing.jcheckboxmenuitem;
import javax.swing.jframe;
import javax.swing.jmenu;
import javax.swing.jmenubar;
import javax.swing.jradiobuttonmenuitem;
import javax.swing.jscrollpane;
import javax.swing.jtable;
import javax.swing.listselectionmodel;
import javax.swing.table.tablecolumn;
public class adjustingwidth
{
  jframe jf = new jframe("调整表格列宽 - www.jb51.net");
  jmenubar menubar = new jmenubar();
  jmenu adjustmodemenu = new jmenu("调整方式");
  jmenu selectunitmenu = new jmenu("选择单元");
  jmenu selectmodemenu = new jmenu("选择方式");
  //定义5个单选框按钮,用以控制表格的宽度调整方式
  jradiobuttonmenuitem[] adjustmodesitem = new jradiobuttonmenuitem[5];
  //定义3个单选框按钮,用以控制表格的选择方式
  jradiobuttonmenuitem[] selectmodesitem = new jradiobuttonmenuitem[3];
  jcheckboxmenuitem rowsitem = new jcheckboxmenuitem("选择行");
  jcheckboxmenuitem columnsitem = new jcheckboxmenuitem("选择列");
  jcheckboxmenuitem cellsitem = new jcheckboxmenuitem("选择单元格");
  buttongroup adjustbg = new buttongroup();
  buttongroup selectbg = new buttongroup();
  //定义一个int类型的数组,用于保存表格所有的宽度调整方式
  int[] adjustmodes = new int[]{
    jtable.auto_resize_off,
    jtable.auto_resize_next_column,
    jtable.auto_resize_subsequent_columns,
    jtable.auto_resize_last_column,
    jtable.auto_resize_all_columns
  };
  int[] selectmodes = new int[]{
    listselectionmodel.multiple_interval_selection ,
    listselectionmodel.single_interval_selection ,
    listselectionmodel.single_selection
  };
  jtable table;
  //定义二维数组作为表格数据
  object[][] tabledata =
  {
    new object[]{"李清照" , 29 , "女"},
    new object[]{"苏格拉底", 56 , "男"},
    new object[]{"李白", 35 , "男"},
    new object[]{"弄玉", 18 , "女"},
    new object[]{"虎头" , 2 , "男"}
  };
  //定义一维数据作为列标题
  object[] columntitle = {"姓名" , "年龄" , "性别"};
  public void init()
  {
    //以二维数组和一维数组来创建一个jtable对象
    table = new jtable(tabledata , columntitle);
    //-----------为窗口安装设置表格调整方式的菜单-----------
    adjustmodesitem[0] = new jradiobuttonmenuitem("只调整表格");
    adjustmodesitem[1] = new jradiobuttonmenuitem("只调整下一列");
    adjustmodesitem[2] = new jradiobuttonmenuitem("平均调整余下列");
    adjustmodesitem[3] = new jradiobuttonmenuitem("只调整最后一列");
    adjustmodesitem[4] = new jradiobuttonmenuitem("平均调整所有列");
    menubar.add(adjustmodemenu);
    for (int i = 0; i < adjustmodesitem.length ; i++)
    {
      //默认选中第三个菜单项,即对应表格默认的宽度调整方式
      if (i == 2)
      {
        adjustmodesitem[i].setselected(true);
      }
      adjustbg.add(adjustmodesitem[i]);
      adjustmodemenu.add(adjustmodesitem[i]);
      final int index = i;
      //为设置调整方式的菜单项添加监听器
      adjustmodesitem[i].addactionlistener(new actionlistener()
      {
        public void actionperformed(actionevent evt)
        {
          //如果当前菜单项处于选中状态,表格使用对应的调整方式
          if (adjustmodesitem[index].isselected())
          {
            table.setautoresizemode(adjustmodes[index]);
          }
        }
  public void actionperformed1(actionevent e) {
   // todo 自动生成的方法存根
   
  }
      });
    }
    //-----------为窗口安装设置表格选择方式的菜单-----------
    selectmodesitem[0] = new jradiobuttonmenuitem("无限制");
    selectmodesitem[1] = new jradiobuttonmenuitem("单独的连续区");
    selectmodesitem[2] = new jradiobuttonmenuitem("单选");
    menubar.add(selectmodemenu);
    for (int i = 0; i < selectmodesitem.length ; i++)
    {
      //默认选中第一个菜单项,即对应表格默认的选择方式
      if (i == 0)
      {
        selectmodesitem[i].setselected(true);
      }
      selectbg.add(selectmodesitem[i]);
      selectmodemenu.add(selectmodesitem[i]);
      final int index = i;
      //为设置选择方式的菜单项添加监听器
      selectmodesitem[i].addactionlistener(new actionlistener()
      {
        public void actionperformed(actionevent evt)
        {
          //如果当前菜单项处于选中状态,表格使用对应的选择方式
          if (selectmodesitem[index].isselected())
          {
            table.getselectionmodel().setselectionmode(selectmodes[index]);
          }
        }
      });
    }
    menubar.add(selectunitmenu);
    //-----------为窗口安装设置表格选择单元的菜单-----------
    rowsitem.setselected(table.getrowselectionallowed());
    columnsitem.setselected(table.getcolumnselectionallowed());
    cellsitem.setselected(table.getcellselectionenabled());
    rowsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        table.clearselection();
        //如果该菜单项处于选中状态,设置表格的选择单元是行
        table.setrowselectionallowed(rowsitem.isselected());
        //如果选择行、选择列同时被选中,其实质是选择单元格
        cellsitem.setselected(table.getcellselectionenabled());
      }
    });
    selectunitmenu.add(rowsitem);
    columnsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        table.clearselection();
        //如果该菜单项处于选中状态,设置表格的选择单元是列
        table.setcolumnselectionallowed(columnsitem.isselected());
        //如果选择行、选择列同时被选中,其实质是选择单元格
        cellsitem.setselected(table.getcellselectionenabled());
      }
    });
    selectunitmenu.add(columnsitem);
    cellsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        table.clearselection();
        //如果该菜单项处于选中状态,设置表格的选择单元是单元格
        table.setcellselectionenabled(cellsitem.isselected());
        //该选项的改变会同时影响选择行、选择列两个菜单
        rowsitem.setselected(table.getrowselectionallowed());
        columnsitem.setselected(table.getcolumnselectionallowed());
      }
    });
    selectunitmenu.add(cellsitem);
    jf.setjmenubar(menubar);
    //分别获取表格的三个表格列,并设置三列的最小宽度,最佳宽度和最大宽度
    tablecolumn namecolumn = table.getcolumn(columntitle[0]);
    namecolumn.setminwidth(40);
    tablecolumn agecolumn = table.getcolumn(columntitle[1]);
    agecolumn.setpreferredwidth(50);
    tablecolumn gendercolumn = table.getcolumn(columntitle[2]);
    gendercolumn.setmaxwidth(50);
    //将jtable对象放在jscrollpane中,并将该jscrollpane放在窗口中显示出来
    jf.add(new jscrollpane(table));
    system.out.println(table.getmodel());
    jf.pack();
    jf.setdefaultcloseoperation(jframe.exit_on_close);
    jf.setvisible(true);
  }
  public static void main(string[] args)
  {
    new adjustingwidth().init();
  }
}

运行效果:

Java Swing组件编程之JTable表格用法实例详解

和jlist,jtree类似,jtable采用tablemodel来保存表格中的所有状态数据,采用tablecolumnmodel来保存所有列的数据。

示例3:

package awtdemo;
import java.awt.borderlayout;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.util.arraylist;
import javax.swing.jframe;
import javax.swing.jmenu;
import javax.swing.jmenubar;
import javax.swing.jmenuitem;
import javax.swing.jscrollpane;
import javax.swing.jtable;
import javax.swing.table.defaulttablemodel;
import javax.swing.table.tablecolumn;
import javax.swing.table.tablecolumnmodel;
public class testdefaulttablemodel
{
  jframe mainwin = new jframe("管理数据行、数据列 - www.jb51.net");
  final int column_count = 5;
  defaulttablemodel model;
  jtable table;
  //用于保存被隐藏列的list集合
  arraylist<tablecolumn> hiddencolumns = new arraylist<tablecolumn>();
  public void init()
  {
    model = new defaulttablemodel(column_count ,column_count);
    for (int i = 0; i < column_count ; i++ )
    {
      for (int j = 0; j < column_count ; j++ )
      {
        model.setvalueat("老单元格值 " + i + " " + j , i , j);
      }
    }
    table = new jtable(model);
    mainwin.add(new jscrollpane(table), borderlayout.center);
    //为窗口安装菜单
    jmenubar menubar = new jmenubar();
    mainwin.setjmenubar(menubar);
    jmenu tablemenu = new jmenu("管理");
    menubar.add(tablemenu);
    jmenuitem hidecolumnsitem = new jmenuitem("隐藏选中列");
    hidecolumnsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed1(actionevent event)
      {
        //获取所有选中列的索引
        int[] selected = table.getselectedcolumns();
        tablecolumnmodel columnmodel = table.getcolumnmodel();
        //依次把每一个选中的列隐藏起来,并使用list把这些列保存起来
        for (int i = selected.length - 1; i >= 0; i--)
        {
          tablecolumn column = columnmodel.getcolumn(selected[i]);
          table.removecolumn(column);
          //把隐藏的列保存起来,确保以后可以显示出来
          hiddencolumns.add(column);
        }
      }
  @override
  public void actionperformed(actionevent e) {
  // todo 自动生成的方法存根
  
  }
    });
    tablemenu.add(hidecolumnsitem);
    jmenuitem showcolumnsitem = new jmenuitem("显示隐藏列");
    showcolumnsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        //把所有隐藏列依次显示出来
        for (tablecolumn tc : hiddencolumns)
        {
          //依次把所有隐藏的列显示出来
          table.addcolumn(tc);
        }
        //清空保存隐藏列的list集合
        hiddencolumns.clear();
      }
    });
    tablemenu.add(showcolumnsitem);
    jmenuitem addcolumnitem = new jmenuitem("插入选中列");
    addcolumnitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        //获取所有选中列的索引
        int[] selected = table.getselectedcolumns();
        tablecolumnmodel columnmodel = table.getcolumnmodel();
        //依次把选中的列添加到jtable之后
        for (int i = selected.length - 1; i >= 0; i--)
        {
          tablecolumn column = columnmodel.getcolumn(selected[i]);
          table.addcolumn(column);
        }
      }
    });
    tablemenu.add(addcolumnitem);
    jmenuitem addrowitem = new jmenuitem("增加行");
    addrowitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        //创建一个string数组作为新增行的内容
        string[] newcells = new string[column_count];
        for (int i = 0; i < newcells.length; i++)
        {
          newcells[i] = "新单元格值 " + model.getrowcount() + " " + i;
        }
        //向tablemodel中新增一行。
        model.addrow(newcells);
      }
    });
    tablemenu.add(addrowitem);
    jmenuitem removerowsitem = new jmenuitem("删除选中行");
    removerowsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        //获取所有选中行
        int[] selected = table.getselectedrows();
        //依次删除所有选中行
        for (int i = selected.length - 1; i >= 0; i--)
        {
          model.removerow(selected[i]);
        }
      }
    });
    tablemenu.add(removerowsitem);
    mainwin.pack();
    mainwin.setdefaultcloseoperation(jframe.exit_on_close);
    mainwin.setvisible(true);
  }
  public static void main(string[] args)
  {
    new testdefaulttablemodel().init();
  }
}

运行效果:

Java Swing组件编程之JTable表格用法实例详解

但要注意列的增加,只是将原来隐藏的列显示,而不是真正增加列,你要新增的话那就重新new个jtable

前面讲的表格,单元格都是字符串,这是由于我们传入的都是defaulttablemodel它最终调用tostring方法来绘制表格,具体自定义单元格的方法如下,

示例4:

public class testtablecellrenderer
{
  jframe jf = new jframe("使用单元格绘制器");
  jtable table;
  //定义二维数组作为表格数据
  object[][] tabledata =
  {
    new object[]{"李清照" , 29 , "女" , new imageicon("icon/3.gif") , true},
    new object[]{"苏格拉底", 56 , "男" , new imageicon("icon/1.gif") , false},
    new object[]{"李白", 35 , "男" , new imageicon("icon/4.gif") , true},
    new object[]{"弄玉", 18 , "女" , new imageicon("icon/2.gif") , true},
    new object[]{"虎头" , 2 , "男" , new imageicon("icon/5.gif") , true}
  };
  //定义一维数据作为列标题
  string[] columntitle = {"姓名" , "年龄" , "性别" , "主头像" , "是否中国人"};
  public void init()
  {
    //以二维数组和一维数组来创建一个extendedtablemodel对象
    extendedtablemodel model = new extendedtablemodel(columntitle , tabledata);
    //以extendedtablemodel来创建jtable
    table = new jtable( model);
    table.setrowselectionallowed(false);
    table.setrowheight(40);
    //获取第三列
    tablecolumn lastcolumn = table.getcolumnmodel().getcolumn(2);
    //对第三列采用自定义的单元格绘制器
    lastcolumn.setcellrenderer(new gendertablecellrenderer());
    //将jtable对象放在jscrollpane中,并将该jscrollpane放在窗口中显示出来
    jf.add(new jscrollpane(table));
    jf.pack();
    jf.setdefaultcloseoperation(jframe.exit_on_close);
    jf.setvisible(true);
  }
  public static void main(string[] args)
  {
    new testtablecellrenderer().init();
  }
}

class extendedtablemodel extends defaulttablemodel
{
  //重新提供一个构造器,该构造器的实现委托给defaulttablemodel父类
  public extendedtablemodel(string[] columnnames , object[][] cells)
  {
    super(cells , columnnames);
  }
  //重写getcolumnclass方法,根据每列的第一个值来返回其真实的数据类型
  public class getcolumnclass(int c)
  {
    return getvalueat(0 , c).getclass();
  }
}

class gendertablecellrenderer extends jpanel implements tablecellrenderer
{
  private string cellvalue;
  //定义图标的宽度和高度
  final int icon_width = 23;
  final int icon_height = 21;
  public component gettablecellrenderercomponent(jtable table, object value,
    boolean isselected, boolean hasfocus, int row, int column)
  {
    cellvalue = (string)value;
    //设置选中状态下绘制边框
    if (hasfocus)
    {
      setborder(uimanager.getborder("table.focuscellhighlightborder"));
    }
    else
    {
      setborder(null);
    }
    return this;
  }
  //重写paint方法,负责绘制该单元格内容
  public void paint(graphics g)
  {
    //如果表格值为"男"或"male",则绘制一个男性图标
    if (cellvalue.equalsignorecase("男")
      || cellvalue.equalsignorecase("male"))
    {
      drawimage(g , new imageicon("icon/male.gif").getimage());
    }
    //如果表格值为"女"或"female",则绘制一个女性图标
    if (cellvalue.equalsignorecase("女")
      || cellvalue.equalsignorecase("female"))
    {
      drawimage(g , new imageicon("icon/female.gif").getimage());
    }
  }
  //绘制图标的方法
  private void drawimage(graphics g , image image)
  {
    g.drawimage(image, (getwidth() - icon_width ) / 2
      , (getheight() - icon_height) / 2 , null);
  }
}

我这里只是实现了每列不同的控件,大家还可以自定义一个表格每行每列都是不同的控件,那就要得到单元格再setcellrender。

更多关于java相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。