一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java Swing組件編程之JTable表格用法實(shí)例詳解

Java Swing組件編程之JTable表格用法實(shí)例詳解

2021-02-07 16:53toto1297488504 Java教程

這篇文章主要介紹了Java Swing組件編程之JTable表格用法,結(jié)合實(shí)例形式詳細(xì)分析了Swing組件中JTable表格的常見定義與使用方法,需要的朋友可以參考下

本文實(shí)例講述了java swing組件編程之jtable表格用法。分享給大家供大家參考,具體如下:

表格是gui編程中使用較多,但也是最麻煩的一個(gè)控件之一。表格是用來顯示二維數(shù)據(jù),提供編輯,選擇等功能。如果只是顯示數(shù)據(jù),這還是非常easy的,只要在jtable中傳入二維數(shù)組或集合就可以了。

示例1:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package awtdemo;
import javax.swing.jframe;
import javax.swing.jscrollpane;
import javax.swing.jtable;
public class simpletable
{
  jframe jf = new jframe("簡(jiǎn)單表格 - www.ythuaji.com.cn");
  jtable table;
  //定義二維數(shù)組作為表格數(shù)據(jù)
  object[][] tabledata =
  {
    new object[]{"李清照" , 29 , "女"},
    new object[]{"蘇格拉底", 56 , "男"},
    new object[]{"李白", 35 , "男"},
    new object[]{"弄玉", 18 , "女"},
    new object[]{"虎頭" , 2 , "男"}
  };
  //定義一維數(shù)據(jù)作為列標(biāo)題
  object[] columntitle = {"姓名" , "年齡" , "性別"};
  public void init()
  {
    //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)jtable對(duì)象
    table = new jtable(tabledata , columntitle);
    //將jtable對(duì)象放在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();
  }
}

運(yùn)行效果:

Java Swing組件編程之JTable表格用法實(shí)例詳解

下面舉個(gè)jtable表格調(diào)整和選擇方式的例子。

示例2:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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("調(diào)整表格列寬 - www.ythuaji.com.cn");
  jmenubar menubar = new jmenubar();
  jmenu adjustmodemenu = new jmenu("調(diào)整方式");
  jmenu selectunitmenu = new jmenu("選擇單元");
  jmenu selectmodemenu = new jmenu("選擇方式");
  //定義5個(gè)單選框按鈕,用以控制表格的寬度調(diào)整方式
  jradiobuttonmenuitem[] adjustmodesitem = new jradiobuttonmenuitem[5];
  //定義3個(gè)單選框按鈕,用以控制表格的選擇方式
  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();
  //定義一個(gè)int類型的數(shù)組,用于保存表格所有的寬度調(diào)整方式
  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;
  //定義二維數(shù)組作為表格數(shù)據(jù)
  object[][] tabledata =
  {
    new object[]{"李清照" , 29 , "女"},
    new object[]{"蘇格拉底", 56 , "男"},
    new object[]{"李白", 35 , "男"},
    new object[]{"弄玉", 18 , "女"},
    new object[]{"虎頭" , 2 , "男"}
  };
  //定義一維數(shù)據(jù)作為列標(biāo)題
  object[] columntitle = {"姓名" , "年齡" , "性別"};
  public void init()
  {
    //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)jtable對(duì)象
    table = new jtable(tabledata , columntitle);
    //-----------為窗口安裝設(shè)置表格調(diào)整方式的菜單-----------
    adjustmodesitem[0] = new jradiobuttonmenuitem("只調(diào)整表格");
    adjustmodesitem[1] = new jradiobuttonmenuitem("只調(diào)整下一列");
    adjustmodesitem[2] = new jradiobuttonmenuitem("平均調(diào)整余下列");
    adjustmodesitem[3] = new jradiobuttonmenuitem("只調(diào)整最后一列");
    adjustmodesitem[4] = new jradiobuttonmenuitem("平均調(diào)整所有列");
    menubar.add(adjustmodemenu);
    for (int i = 0; i < adjustmodesitem.length ; i++)
    {
      //默認(rèn)選中第三個(gè)菜單項(xiàng),即對(duì)應(yīng)表格默認(rèn)的寬度調(diào)整方式
      if (i == 2)
      {
        adjustmodesitem[i].setselected(true);
      }
      adjustbg.add(adjustmodesitem[i]);
      adjustmodemenu.add(adjustmodesitem[i]);
      final int index = i;
      //為設(shè)置調(diào)整方式的菜單項(xiàng)添加監(jiān)聽器
      adjustmodesitem[i].addactionlistener(new actionlistener()
      {
        public void actionperformed(actionevent evt)
        {
          //如果當(dāng)前菜單項(xiàng)處于選中狀態(tài),表格使用對(duì)應(yīng)的調(diào)整方式
          if (adjustmodesitem[index].isselected())
          {
            table.setautoresizemode(adjustmodes[index]);
          }
        }
  public void actionperformed1(actionevent e) {
   // todo 自動(dòng)生成的方法存根
   
  }
      });
    }
    //-----------為窗口安裝設(shè)置表格選擇方式的菜單-----------
    selectmodesitem[0] = new jradiobuttonmenuitem("無限制");
    selectmodesitem[1] = new jradiobuttonmenuitem("單獨(dú)的連續(xù)區(qū)");
    selectmodesitem[2] = new jradiobuttonmenuitem("單選");
    menubar.add(selectmodemenu);
    for (int i = 0; i < selectmodesitem.length ; i++)
    {
      //默認(rèn)選中第一個(gè)菜單項(xiàng),即對(duì)應(yīng)表格默認(rèn)的選擇方式
      if (i == 0)
      {
        selectmodesitem[i].setselected(true);
      }
      selectbg.add(selectmodesitem[i]);
      selectmodemenu.add(selectmodesitem[i]);
      final int index = i;
      //為設(shè)置選擇方式的菜單項(xiàng)添加監(jiān)聽器
      selectmodesitem[i].addactionlistener(new actionlistener()
      {
        public void actionperformed(actionevent evt)
        {
          //如果當(dāng)前菜單項(xiàng)處于選中狀態(tài),表格使用對(duì)應(yīng)的選擇方式
          if (selectmodesitem[index].isselected())
          {
            table.getselectionmodel().setselectionmode(selectmodes[index]);
          }
        }
      });
    }
    menubar.add(selectunitmenu);
    //-----------為窗口安裝設(shè)置表格選擇單元的菜單-----------
    rowsitem.setselected(table.getrowselectionallowed());
    columnsitem.setselected(table.getcolumnselectionallowed());
    cellsitem.setselected(table.getcellselectionenabled());
    rowsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        table.clearselection();
        //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是行
        table.setrowselectionallowed(rowsitem.isselected());
        //如果選擇行、選擇列同時(shí)被選中,其實(shí)質(zhì)是選擇單元格
        cellsitem.setselected(table.getcellselectionenabled());
      }
    });
    selectunitmenu.add(rowsitem);
    columnsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        table.clearselection();
        //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是列
        table.setcolumnselectionallowed(columnsitem.isselected());
        //如果選擇行、選擇列同時(shí)被選中,其實(shí)質(zhì)是選擇單元格
        cellsitem.setselected(table.getcellselectionenabled());
      }
    });
    selectunitmenu.add(columnsitem);
    cellsitem.addactionlistener(new actionlistener()
    {
      public void actionperformed(actionevent event)
      {
        table.clearselection();
        //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是單元格
        table.setcellselectionenabled(cellsitem.isselected());
        //該選項(xiàng)的改變會(huì)同時(shí)影響選擇行、選擇列兩個(gè)菜單
        rowsitem.setselected(table.getrowselectionallowed());
        columnsitem.setselected(table.getcolumnselectionallowed());
      }
    });
    selectunitmenu.add(cellsitem);
    jf.setjmenubar(menubar);
    //分別獲取表格的三個(gè)表格列,并設(shè)置三列的最小寬度,最佳寬度和最大寬度
    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對(duì)象放在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();
  }
}

運(yùn)行效果:

Java Swing組件編程之JTable表格用法實(shí)例詳解

和jlist,jtree類似,jtable采用tablemodel來保存表格中的所有狀態(tài)數(shù)據(jù),采用tablecolumnmodel來保存所有列的數(shù)據(jù)。

示例3:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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("管理數(shù)據(jù)行、數(shù)據(jù)列 - www.ythuaji.com.cn");
  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();
        //依次把每一個(gè)選中的列隱藏起來,并使用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 自動(dòng)生成的方法存根
  
  }
    });
    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();
        //依次把選中的列添加到j(luò)table之后
        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)
      {
        //創(chuàng)建一個(gè)string數(shù)組作為新增行的內(nèi)容
        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();
  }
}

運(yùn)行效果:

Java Swing組件編程之JTable表格用法實(shí)例詳解

但要注意列的增加,只是將原來隱藏的列顯示,而不是真正增加列,你要新增的話那就重新new個(gè)jtable

前面講的表格,單元格都是字符串,這是由于我們傳入的都是defaulttablemodel它最終調(diào)用tostring方法來繪制表格,具體自定義單元格的方法如下,

示例4:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class testtablecellrenderer
{
  jframe jf = new jframe("使用單元格繪制器");
  jtable table;
  //定義二維數(shù)組作為表格數(shù)據(jù)
  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}
  };
  //定義一維數(shù)據(jù)作為列標(biāo)題
  string[] columntitle = {"姓名" , "年齡" , "性別" , "主頭像" , "是否中國人"};
  public void init()
  {
    //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)extendedtablemodel對(duì)象
    extendedtablemodel model = new extendedtablemodel(columntitle , tabledata);
    //以extendedtablemodel來創(chuàng)建jtable
    table = new jtable( model);
    table.setrowselectionallowed(false);
    table.setrowheight(40);
    //獲取第三列
    tablecolumn lastcolumn = table.getcolumnmodel().getcolumn(2);
    //對(duì)第三列采用自定義的單元格繪制器
    lastcolumn.setcellrenderer(new gendertablecellrenderer());
    //將jtable對(duì)象放在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();
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
class extendedtablemodel extends defaulttablemodel
{
  //重新提供一個(gè)構(gòu)造器,該構(gòu)造器的實(shí)現(xiàn)委托給defaulttablemodel父類
  public extendedtablemodel(string[] columnnames , object[][] cells)
  {
    super(cells , columnnames);
  }
  //重寫getcolumnclass方法,根據(jù)每列的第一個(gè)值來返回其真實(shí)的數(shù)據(jù)類型
  public class getcolumnclass(int c)
  {
    return getvalueat(0 , c).getclass();
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class gendertablecellrenderer extends jpanel implements tablecellrenderer
{
  private string cellvalue;
  //定義圖標(biāo)的寬度和高度
  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;
    //設(shè)置選中狀態(tài)下繪制邊框
    if (hasfocus)
    {
      setborder(uimanager.getborder("table.focuscellhighlightborder"));
    }
    else
    {
      setborder(null);
    }
    return this;
  }
  //重寫paint方法,負(fù)責(zé)繪制該單元格內(nèi)容
  public void paint(graphics g)
  {
    //如果表格值為"男"或"male",則繪制一個(gè)男性圖標(biāo)
    if (cellvalue.equalsignorecase("男")
      || cellvalue.equalsignorecase("male"))
    {
      drawimage(g , new imageicon("icon/male.gif").getimage());
    }
    //如果表格值為"女"或"female",則繪制一個(gè)女性圖標(biāo)
    if (cellvalue.equalsignorecase("女")
      || cellvalue.equalsignorecase("female"))
    {
      drawimage(g , new imageicon("icon/female.gif").getimage());
    }
  }
  //繪制圖標(biāo)的方法
  private void drawimage(graphics g , image image)
  {
    g.drawimage(image, (getwidth() - icon_width ) / 2
      , (getheight() - icon_height) / 2 , null);
  }
}

我這里只是實(shí)現(xiàn)了每列不同的控件,大家還可以自定義一個(gè)表格每行每列都是不同的控件,那就要得到單元格再setcellrender。

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

原文鏈接:http://blog.csdn.net/tototuzuoquan/article/details/8982538

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 奇米影视奇米色777欧美 | 色综合图区 | 波多洁野衣一二区三区 | 免费看麻豆视频 | 国产chinese男男gaygay | 十六一下岁女子毛片免费 | 亚洲精品视频观看 | 精品久久久噜噜噜久久7 | 日本老妇人乱视频 | 色天天综合色天天看 | 日韩亚洲国产欧美精品 | 国产拍拍视频一二三四区 | 我的好妈妈7中字在线观看韩国 | 国产午夜免费视频 | 午夜免费小视频 | 天天做天天爱天天综合网 | 亚洲国产天堂综合一区 | 东方影库四虎 | 欧美午夜精品久久久久久黑人 | 啊哈~嗯哼~用力cao我小说 | 99精品视频免费在线观看 | 日韩欧美高清 | 色欲都市 | 精品久久香蕉国产线看观看麻豆 | 日韩高清一区二区 | 三星w699 | 国产一卡二卡3卡4卡四卡在线视频 | 精品国产麻豆免费人成网站 | 深夜福利在线播放 | 亚洲天堂岛国片 | 69短视频| 日本wwxx护士 | 久久久伊人影院 | 国产在线精品一区二区高清不卡 | 久久不卡免费视频 | 亚洲色图亚洲色图 | 熟睡中的麻麻大白屁股小说 | 欧美久久久久久久一区二区三区 | 青青青国产精品国产精品美女 | www日本视频 | 精品在线网站 |