当前位置: 移动技术网 > IT编程>开发语言>Java > Java Swing组件编程之JTable表格用法实例详解

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

2019年07月19日  | 移动技术网IT编程  | 我要评论

本文实例讲述了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();
  }
}

运行效果:

下面举个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();
  }
}

运行效果:

和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();
  }
}

运行效果:

但要注意列的增加,只是将原来隐藏的列显示,而不是真正增加列,你要新增的话那就重新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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网