自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java Swing編程:JTable表格

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

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

  1. public class SimpleTable  
  2. {  
  3.     JFrame jf = new JFrame("簡單表格");  
  4.     JTable table;  
  5.     //定義二維數(shù)組作為表格數(shù)據(jù)  
  6.     Object[][] tableData =   
  7.     {  
  8.         new Object[]{"李清照" , 29 , "女"},  
  9.         new Object[]{"蘇格拉底"56 , "男"},  
  10.         new Object[]{"李白"35 , "男"},  
  11.         new Object[]{"弄玉"18 , "女"},  
  12.         new Object[]{"虎頭" , 2 , "男"}  
  13.     };  
  14.     //定義一維數(shù)據(jù)作為列標(biāo)題  
  15.     Object[] columnTitle = {"姓名" , "年齡" , "性別"};  
  16.     public void init()  
  17.     {  
  18.         //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)JTable對(duì)象  
  19.         table = new JTable(tableData , columnTitle);  
  20.         //將JTable對(duì)象放在JScrollPane中,并將該JScrollPane放在窗口中顯示出來  
  21.         jf.add(new JScrollPane(table));  
  22.         jf.pack();  
  23.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  24.         jf.setVisible(true);  
  25.     }  
  26.     public static void main(String[] args)   
  27.     {  
  28.         new SimpleTable().init();  
  29.     }  
  30. }  

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

  1. public class AdjustingWidth  
  2. {  
  3.     JFrame jf = new JFrame("調(diào)整表格列寬");  
  4.     JMenuBar menuBar = new JMenuBar();  
  5.     JMenu adjustModeMenu = new JMenu("調(diào)整方式");  
  6.     JMenu selectUnitMenu = new JMenu("選擇單元");  
  7.     JMenu selectModeMenu = new JMenu("選擇方式");  
  8.  
  9.     //定義5個(gè)單選框按鈕,用以控制表格的寬度調(diào)整方式  
  10.     JRadioButtonMenuItem[] adjustModesItem = new JRadioButtonMenuItem[5];  
  11.     //定義3個(gè)單選框按鈕,用以控制表格的選擇方式  
  12.     JRadioButtonMenuItem[] selectModesItem = new JRadioButtonMenuItem[3];  
  13.  
  14.     JCheckBoxMenuItem rowsItem = new JCheckBoxMenuItem("選擇行");  
  15.     JCheckBoxMenuItem columnsItem = new JCheckBoxMenuItem("選擇列");  
  16.     JCheckBoxMenuItem cellsItem = new JCheckBoxMenuItem("選擇單元格");  
  17.     ButtonGroup adjustBg = new ButtonGroup();  
  18.     ButtonGroup selectBg = new ButtonGroup();  
  19.     //定義一個(gè)int類型的數(shù)組,用于保存表格所有的寬度調(diào)整方式  
  20.     int[] adjustModes = new int[]{  
  21.         JTable.AUTO_RESIZE_OFF,  
  22.         JTable.AUTO_RESIZE_NEXT_COLUMN,  
  23.         JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS,  
  24.         JTable.AUTO_RESIZE_LAST_COLUMN,  
  25.         JTable.AUTO_RESIZE_ALL_COLUMNS   
  26.     };  
  27.     int[] selectModes = new int[]{  
  28.         ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ,  
  29.         ListSelectionModel.SINGLE_INTERVAL_SELECTION ,  
  30.         ListSelectionModel.SINGLE_SELECTION  
  31.     };  
  32.     JTable table;  
  33.     //定義二維數(shù)組作為表格數(shù)據(jù)  
  34.     Object[][] tableData =   
  35.     {  
  36.         new Object[]{"李清照" , 29 , "女"},  
  37.         new Object[]{"蘇格拉底"56 , "男"},  
  38.         new Object[]{"李白"35 , "男"},  
  39.         new Object[]{"弄玉"18 , "女"},  
  40.         new Object[]{"虎頭" , 2 , "男"}  
  41.     };  
  42.     //定義一維數(shù)據(jù)作為列標(biāo)題  
  43.     Object[] columnTitle = {"姓名" , "年齡" , "性別"};  
  44.  
  45.     public void init()  
  46.     {  
  47.         //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)JTable對(duì)象  
  48.         table = new JTable(tableData , columnTitle);  
  49.  
  50.         //-----------為窗口安裝設(shè)置表格調(diào)整方式的菜單-----------  
  51.         adjustModesItem[0] = new JRadioButtonMenuItem("只調(diào)整表格");  
  52.         adjustModesItem[1] = new JRadioButtonMenuItem("只調(diào)整下一列");  
  53.         adjustModesItem[2] = new JRadioButtonMenuItem("平均調(diào)整余下列");  
  54.         adjustModesItem[3] = new JRadioButtonMenuItem("只調(diào)整最后一列");  
  55.         adjustModesItem[4] = new JRadioButtonMenuItem("平均調(diào)整所有列");  
  56.         menuBar.add(adjustModeMenu);  
  57.         for (int i = 0; i < adjustModesItem.length ; i++)  
  58.         {  
  59.             //默認(rèn)選中第三個(gè)菜單項(xiàng),即對(duì)應(yīng)表格默認(rèn)的寬度調(diào)整方式  
  60.             if (i == 2)  
  61.             {  
  62.                 adjustModesItem[i].setSelected(true);  
  63.             }  
  64.             adjustBg.add(adjustModesItem[i]);  
  65.             adjustModeMenu.add(adjustModesItem[i]);  
  66.             final int index = i;  
  67.             //為設(shè)置調(diào)整方式的菜單項(xiàng)添加監(jiān)聽器  
  68.             adjustModesItem[i].addActionListener(new ActionListener()  
  69.             {  
  70.                 public void actionPerformed(ActionEvent evt)  
  71.                 {  
  72.                     //如果當(dāng)前菜單項(xiàng)處于選中狀態(tài),表格使用對(duì)應(yīng)的調(diào)整方式  
  73.                     if (adjustModesItem[index].isSelected())  
  74.                     {  
  75.                         table.setAutoResizeMode(adjustModes[index]);  
  76.                     }  
  77.                 }  
  78.             });  
  79.         }  
  80.         //-----------為窗口安裝設(shè)置表格選擇方式的菜單-----------  
  81.         selectModesItem[0] = new JRadioButtonMenuItem("無限制");  
  82.         selectModesItem[1] = new JRadioButtonMenuItem("單獨(dú)的連續(xù)區(qū)");  
  83.         selectModesItem[2] = new JRadioButtonMenuItem("單選");  
  84.         menuBar.add(selectModeMenu);  
  85.         for (int i = 0; i < selectModesItem.length ; i++)  
  86.         {  
  87.             //默認(rèn)選中第一個(gè)菜單項(xiàng),即對(duì)應(yīng)表格默認(rèn)的選擇方式  
  88.             if (i == 0)  
  89.             {  
  90.                 selectModesItem[i].setSelected(true);  
  91.             }  
  92.             selectBg.add(selectModesItem[i]);  
  93.             selectModeMenu.add(selectModesItem[i]);  
  94.             final int index = i;  
  95.             //為設(shè)置選擇方式的菜單項(xiàng)添加監(jiān)聽器  
  96.             selectModesItem[i].addActionListener(new ActionListener()  
  97.             {  
  98.                 public void actionPerformed(ActionEvent evt)  
  99.                 {  
  100.                     //如果當(dāng)前菜單項(xiàng)處于選中狀態(tài),表格使用對(duì)應(yīng)的選擇方式  
  101.                     if (selectModesItem[index].isSelected())  
  102.                     {  
  103.                         table.getSelectionModel().setSelectionMode(selectModes[index]);  
  104.                     }  
  105.                 }  
  106.             });  
  107.         }  
  108.         menuBar.add(selectUnitMenu);  
  109.         //-----------為窗口安裝設(shè)置表格選擇單元的菜單-----------  
  110.         rowsItem.setSelected(table.getRowSelectionAllowed());  
  111.         columnsItem.setSelected(table.getColumnSelectionAllowed());  
  112.         cellsItem.setSelected(table.getCellSelectionEnabled());  
  113.  
  114.         rowsItem.addActionListener(new ActionListener()  
  115.         {  
  116.             public void actionPerformed(ActionEvent event)  
  117.             {  
  118.                 table.clearSelection();  
  119.                 //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是行  
  120.                 table.setRowSelectionAllowed(rowsItem.isSelected());  
  121.                 //如果選擇行、選擇列同時(shí)被選中,其實(shí)質(zhì)是選擇單元格  
  122.                 cellsItem.setSelected(table.getCellSelectionEnabled());  
  123.             }  
  124.         });  
  125.         selectUnitMenu.add(rowsItem);  
  126.         columnsItem.addActionListener(new ActionListener()  
  127.         {  
  128.             public void actionPerformed(ActionEvent event)  
  129.             {  
  130.                 table.clearSelection();  
  131.                 //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是列  
  132.                 table.setColumnSelectionAllowed(columnsItem.isSelected());  
  133.                 //如果選擇行、選擇列同時(shí)被選中,其實(shí)質(zhì)是選擇單元格  
  134.                 cellsItem.setSelected(table.getCellSelectionEnabled());  
  135.             }  
  136.         });  
  137.         selectUnitMenu.add(columnsItem);  
  138.         cellsItem.addActionListener(new ActionListener()  
  139.         {  
  140.             public void actionPerformed(ActionEvent event)  
  141.             {  
  142.                 table.clearSelection();  
  143.                 //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是單元格  
  144.                 table.setCellSelectionEnabled(cellsItem.isSelected());  
  145.                 //該選項(xiàng)的改變會(huì)同時(shí)影響選擇行、選擇列兩個(gè)菜單  
  146.                 rowsItem.setSelected(table.getRowSelectionAllowed());  
  147.                 columnsItem.setSelected(table.getColumnSelectionAllowed());  
  148.             }  
  149.         });  
  150.         selectUnitMenu.add(cellsItem);  
  151.  
  152.         jf.setJMenuBar(menuBar);  
  153.         //分別獲取表格的三個(gè)表格列,并設(shè)置三列的最小寬度,最佳寬度和最大寬度  
  154.         TableColumn nameColumn = table.getColumn(columnTitle[0]);  
  155.         nameColumn.setMinWidth(40);  
  156.         TableColumn ageColumn = table.getColumn(columnTitle[1]);  
  157.         ageColumn.setPreferredWidth(50);  
  158.         TableColumn genderColumn = table.getColumn(columnTitle[2]);  
  159.         genderColumn.setMaxWidth(50);  
  160.  
  161.  
  162.         //將JTable對(duì)象放在JScrollPane中,并將該JScrollPane放在窗口中顯示出來  
  163.         jf.add(new JScrollPane(table));  
  164.         System.out.println(table.getModel());  
  165.         jf.pack();  
  166.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  167.         jf.setVisible(true);  
  168.     }  
  169.  
  170.     public static void main(String[] args)   
  171.     {  
  172.         new AdjustingWidth().init();  
  173.     }  
  174. }  

和JList,JTree類似,JTable采用TableModel來保存表格中的所有狀態(tài)數(shù)據(jù),采用TableColumnModel來保存所有列的數(shù)據(jù)。eg

  1. public class TestDefaultTableModel  
  2. {  
  3.     JFrame mainWin = new JFrame("管理數(shù)據(jù)行、數(shù)據(jù)列");  
  4.     final int COLUMN_COUNT = 5;  
  5.     DefaultTableModel model;  
  6.     JTable table;  
  7.     //用于保存被隱藏列的List集合  
  8.     ArrayList<TableColumn> hiddenColumns = new ArrayList<TableColumn>();  
  9.     public void init()  
  10.     {  
  11.         model = new DefaultTableModel(COLUMN_COUNT ,COLUMN_COUNT);  
  12.         for (int i = 0; i < COLUMN_COUNT ; i++ )  
  13.         {  
  14.             for (int j = 0; j < COLUMN_COUNT ; j++ )  
  15.             {  
  16.                 model.setValueAt("老單元格值 " + i + " " + j , i , j);  
  17.             }  
  18.         }  
  19.  
  20.         table = new JTable(model);  
  21.  
  22.         mainWin.add(new JScrollPane(table), BorderLayout.CENTER);  
  23.  
  24.         //為窗口安裝菜單  
  25.         JMenuBar menuBar = new JMenuBar();  
  26.         mainWin.setJMenuBar(menuBar);  
  27.         JMenu tableMenu = new JMenu("管理");  
  28.         menuBar.add(tableMenu);  
  29.  
  30.         JMenuItem hideColumnsItem = new JMenuItem("隱藏選中列");  
  31.         hideColumnsItem.addActionListener(new ActionListener()  
  32.         {  
  33.             public void actionPerformed(ActionEvent event)  
  34.             {  
  35.                 //獲取所有選中列的索引  
  36.                 int[] selected = table.getSelectedColumns();  
  37.                 TableColumnModel columnModel = table.getColumnModel();  
  38.                 //依次把每一個(gè)選中的列隱藏起來,并使用List把這些列保存起來  
  39.                 for (int i = selected.length - 1; i >= 0; i--)  
  40.                 {  
  41.                     TableColumn column = columnModel.getColumn(selected[i]);  
  42.                     table.removeColumn(column);  
  43.                     //把隱藏的列保存起來,確保以后可以顯示出來  
  44.                     hiddenColumns.add(column);  
  45.                 }  
  46.             }  
  47.         });  
  48.         tableMenu.add(hideColumnsItem);  
  49.  
  50.         JMenuItem showColumnsItem = new JMenuItem("顯示隱藏列");  
  51.         showColumnsItem.addActionListener(new ActionListener()  
  52.         {  
  53.             public void actionPerformed(ActionEvent event)  
  54.             {  
  55.                 //把所有隱藏列依次顯示出來  
  56.                 for (TableColumn tc : hiddenColumns)  
  57.                 {  
  58.                     //依次把所有隱藏的列顯示出來  
  59.                     table.addColumn(tc);  
  60.                 }  
  61.                 //清空保存隱藏列的List集合  
  62.                 hiddenColumns.clear();              
  63.             }  
  64.         });  
  65.         tableMenu.add(showColumnsItem);  
  66.  
  67.         JMenuItem addColumnItem = new JMenuItem("插入選中列");  
  68.         addColumnItem.addActionListener(new ActionListener()  
  69.         {  
  70.             public void actionPerformed(ActionEvent event)  
  71.             {  
  72.                 //獲取所有選中列的索引  
  73.                 int[] selected = table.getSelectedColumns();  
  74.                 TableColumnModel columnModel = table.getColumnModel();  
  75.                 //依次把選中的列添加到JTable之后  
  76.                 for (int i = selected.length - 1; i >= 0; i--)  
  77.                 {    
  78.                     TableColumn column = columnModel.getColumn(selected[i]);  
  79.                     table.addColumn(column);  
  80.                 }  
  81.             }  
  82.         });  
  83.         tableMenu.add(addColumnItem);  
  84.  
  85.         JMenuItem addRowItem = new JMenuItem("增加行");  
  86.         addRowItem.addActionListener(new ActionListener()  
  87.         {  
  88.             public void actionPerformed(ActionEvent event)  
  89.             {  
  90.                 //創(chuàng)建一個(gè)String數(shù)組作為新增行的內(nèi)容  
  91.                 String[] newCells = new String[COLUMN_COUNT];  
  92.                 for (int i = 0; i < newCells.length; i++)  
  93.                 {  
  94.                     newCells[i] = "新單元格值 " + model.getRowCount() + " " + i;  
  95.                 }  
  96.                 //向TableModel中新增一行。  
  97.                 model.addRow(newCells);  
  98.             }  
  99.         });  
  100.         tableMenu.add(addRowItem);  
  101.  
  102.         JMenuItem removeRowsItem = new  JMenuItem("刪除選中行");  
  103.         removeRowsItem.addActionListener(new ActionListener()  
  104.         {  
  105.             public void actionPerformed(ActionEvent event)  
  106.             {  
  107.                 //獲取所有選中行  
  108.                 int[] selected = table.getSelectedRows();  
  109.                 //依次刪除所有選中行  
  110.                 for (int i = selected.length - 1; i >= 0; i--)  
  111.                 {  
  112.                     model.removeRow(selected[i]);  
  113.                 }  
  114.             }  
  115.         });  
  116.         tableMenu.add(removeRowsItem);  
  117.  
  118.         mainWin.pack();  
  119.         mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  120.         mainWin.setVisible(true);  
  121.     }  
  122.  
  123.     public static void main(String[] args)   
  124.     {  
  125.         new TestDefaultTableModel().init();  
  126.     }  

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

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

  1. public class TestTableCellRenderer  
  2. {  
  3.     JFrame jf = new JFrame("使用單元格繪制器");  
  4.     JTable table;  
  5.     //定義二維數(shù)組作為表格數(shù)據(jù)  
  6.     Object[][] tableData =   
  7.     {  
  8.         new Object[]{"李清照" , 29 , "女" , new ImageIcon("icon/3.gif") , true},  
  9.         new Object[]{"蘇格拉底"56 , "男" , new ImageIcon("icon/1.gif") , false},  
  10.         new Object[]{"李白"35 , "男" , new ImageIcon("icon/4.gif")  , true},  
  11.         new Object[]{"弄玉"18 , "女" , new ImageIcon("icon/2.gif")  , true},  
  12.         new Object[]{"虎頭" , 2 , "男" , new ImageIcon("icon/5.gif") , true}  
  13.     };  
  14.     //定義一維數(shù)據(jù)作為列標(biāo)題  
  15.     String[] columnTitle = {"姓名" , "年齡" , "性別" , "主頭像" , "是否中國人"};  
  16.     public void init()  
  17.     {  
  18.         //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)ExtendedTableModel對(duì)象  
  19.         ExtendedTableModel model = new ExtendedTableModel(columnTitle , tableData);  
  20.         //以ExtendedTableModel來創(chuàng)建JTable  
  21.         table = new JTable( model);  
  22.         table.setRowSelectionAllowed(false);  
  23.         table.setRowHeight(40);  
  24.         //獲取第三列  
  25.         TableColumn lastColumn = table.getColumnModel().getColumn(2);  
  26.         //對(duì)第三列采用自定義的單元格繪制器  
  27.         lastColumn.setCellRenderer(new GenderTableCellRenderer());  
  28.  
  29.         //將JTable對(duì)象放在JScrollPane中,并將該JScrollPane放在窗口中顯示出來  
  30.         jf.add(new JScrollPane(table));  
  31.         jf.pack();  
  32.         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  33.         jf.setVisible(true);  
  34.     }  
  35.     public static void main(String[] args)   
  36.     {  
  37.         new TestTableCellRenderer().init();  
  38.     }  
  39. }  
  40.  
  41. class ExtendedTableModel extends DefaultTableModel  
  42. {  
  43.     //重新提供一個(gè)構(gòu)造器,該構(gòu)造器的實(shí)現(xiàn)委托給DefaultTableModel父類  
  44.     public ExtendedTableModel(String[] columnNames , Object[][] cells)  
  45.     {  
  46.         super(cells , columnNames);  
  47.     }  
  48.     //重寫getColumnClass方法,根據(jù)每列的第一個(gè)值來返回其真實(shí)的數(shù)據(jù)類型  
  49.     public Class getColumnClass(int c)   
  50.     {  
  51.         return getValueAt(0 , c).getClass();  
  52.     }  
  53. }  
  54.  
  55. class GenderTableCellRenderer extends JPanel implements TableCellRenderer  
  56. {  
  57.     private String cellValue;  
  58.     //定義圖標(biāo)的寬度和高度  
  59.     final int ICON_WIDTH = 23;  
  60.     final int ICON_HEIGHT = 21;  
  61.     public Component getTableCellRendererComponent(JTable table, Object value,   
  62.         boolean isSelected, boolean hasFocus, int row, int column)  
  63.     {  
  64.         cellValue = (String)value;  
  65.         //設(shè)置選中狀態(tài)下繪制邊框  
  66.         if (hasFocus)  
  67.         {  
  68.             setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));  
  69.         }  
  70.         else 
  71.         {  
  72.             setBorder(null);  
  73.         }  
  74.         return this;  
  75.     }  
  76.     //重寫paint方法,負(fù)責(zé)繪制該單元格內(nèi)容  
  77.     public void paint(Graphics g)  
  78.     {  
  79.         //如果表格值為"男"或"male",則繪制一個(gè)男性圖標(biāo)  
  80.         if (cellValue.equalsIgnoreCase("男")   
  81.             || cellValue.equalsIgnoreCase("male"))  
  82.         {  
  83.             drawImage(g , new ImageIcon("icon/male.gif").getImage());   
  84.         }  
  85.         //如果表格值為"女"或"female",則繪制一個(gè)女性圖標(biāo)  
  86.         if (cellValue.equalsIgnoreCase("女")   
  87.             || cellValue.equalsIgnoreCase("female"))  
  88.         {  
  89.             drawImage(g , new ImageIcon("icon/female.gif").getImage());   
  90.         }  
  91.     }  
  92.     //繪制圖標(biāo)的方法  
  93.     private void drawImage(Graphics g , Image image)  
  94.     {  
  95.         g.drawImage(image, (getWidth() - ICON_WIDTH ) / 2   
  96.             , (getHeight() - ICON_HEIGHT) / 2 , null);  
  97.     }  

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

原文鏈接:http://blog.csdn.net/terryzero/article/details/3838423

【編輯推薦】

  1. Java Swing編程:JTree樹
  2. Java Swing編程:微調(diào)控制器和列表框
  3. Java Swing編程:進(jìn)度條和滑動(dòng)條
  4. Java Swing編程:Applet和JApplet
  5. Java Swing編程:拖放功能
責(zé)任編輯:林師授 來源: terryzero的博客
相關(guān)推薦

2009-07-14 09:28:26

JTable和TablSwing

2012-01-17 13:41:34

JavaSwing

2012-01-17 14:05:29

JavaSwing

2012-01-17 13:46:55

JavaSwing

2012-01-17 13:16:34

JavaSwing

2012-01-17 13:53:16

JavaSwing

2012-01-17 13:58:17

JavaSwing

2009-07-16 13:26:32

Swing增加

2012-08-09 11:20:40

Swing

2012-01-17 14:01:33

JavaSwing

2009-07-10 14:20:01

AcceleratorJava Swing

2009-07-10 11:45:44

Java Swing

2009-07-16 11:13:50

Java Swing

2009-07-10 10:47:01

Java Swing

2009-07-10 13:09:53

.Net與Java S

2009-07-15 15:35:59

Swing程序Swing性能

2009-07-10 15:10:02

Java Swing經(jīng)

2009-07-16 08:53:03

Swing任務(wù)Swing線程

2009-07-15 13:48:26

Swing模型和渲染器

2012-01-16 16:16:49

JavaSwing
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)