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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

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

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

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

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

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

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

示例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("簡單表格 - m.ythuaji.com.cn");
  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:

?
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("調整表格列寬 - m.ythuaji.com.cn");
  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:

?
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("管理數據行、數據列 - m.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();
        //依次把每一個選中的列隱藏起來,并使用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:

?
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;
  //定義二維數組作為表格數據
  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();
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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();
  }
}
?
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;
  //定義圖標的寬度和高度
  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程序設計有所幫助。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草国内精品视频在线观看 | 久久aa毛片免费播放嗯啊 | 亚洲成年男人的天堂网 | 四虎成人影院网址 | 色综合天天五月色 | 国产午夜精品不卡视频 | 亚洲欧美综合区自拍另类 | 福利国模私拍视频在线观看 | 我们中文在线观看免费完整版 | 五月桃花网婷婷亚洲综合 | 双性肉文高h | 息与子中文字幕bd | 亚洲人成在线播放 | 网站色小妹 | 99国内精品久久久久久久黑人 | 人人九九精 | 美女精品永久福利在线 | 国产偷啪| 毛片大全免费看 | 99热在线获取最新地址 | 四虎影院最新网址 | 男人把大ji巴放进男人免费视频 | 亚洲另类中文字幕 | 暴露狂婷婷 | 亚洲 日韩 国产 中文视频 | 奇米影视888四色首页 | 天美传媒果冻传媒星空传媒 | 日本免费一区二区三区a区 日本免费三片在线观看 | 99久久综合精品免费 | 国产视频一区二区 | v视界影院.vsjla | 爽好大快深点一视频 | 日本阿v在线播放 | 秋霞鲁丝影院久久人人综合 | 9久热久爱免费精品视频在线观看 | 91大片淫黄大片在线天堂 | 俺去也亚洲色图 | 亚洲AV久久久久久久无码 | 百合文高h| 亚洲高清一区二区三区久久 | 四虎4hu永久免费 |