⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 表格(table)的使用与介绍.txt

📁 table小例子 table小例
💻 TXT
📖 第 1 页 / 共 3 页
字号:
     p[row][col]=value;
     fireTableCellUpdated(row,col);
   }
   
   其中value为我们所更改的值,我们将value存入p[row][col]中,并且调用firTableCellUpdated()函数来告诉我们的系统表格已经做了更
改了,关于这一部份,我们后面会再对事件处理作详细地介绍,在此范例中有没有加入fireTableCellUpdated()方法对运行结果不会造成影响
.

8-5:SelectionModel
     表格的选择模式是依据我们前面所讲的ListSelectionModel而来,因此它的操作模式与事件处理跟JList没什么分别!我们稍微复习一
下ListSelectionModel这个Interface,它包含了3个常数值,如下:
      static int SINGLE_SELECTION
      static int SINGLE_INTERVAL_SELECTION
      static int MULTIPLE_INTERVAL_SELECTION
   分别可让用户作单一选择,连续区间选择与多重选择.当用户作后面两个模式的操作时,应配合[Shift]键或[Ctrl]键.
   要使用ListSelectionModel可利用JTable的getSelectionModel()方法取得ListSelectionModel对象,再利用ListSelectionModel界面所
定义的setSelectionModel()来设置选择模式.
   如同JList一般,当用户对表格作数据域位的选取时会产生ListSelectionEvent事件,要处理这个事件就必须实现ListSelectionListener
这个界面,此界面定义了一个方法,那就是valueChanged().
   我们来看下面的例子,用户可在按钮上选择哪种选择模式,当用户选取表格数据时,程序会将用户选取的数据显示在表格下面的JLabel中.
SelectionModelDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class SelectionModelDemo implements ActionListener,ListSelectionListener{
   JTable table=null;
   ListSelectionModel selectionMode=null;
   JLabel label=null;//显示用户选取表格之用
   public SelectionModelDemo(){
   	   JFrame f=new JFrame();
   	   String[] name={"字段1","字段2","字段3","字段4","字段5"};
   	   String[][] data=new String[5][5];
   	   int value=1;
   	   for(int i=0;i<data.length;i++){
   	   	 for (int j=0;j<data[i].length;j++){
   	   	 	 data[i][j]=String.valueOf(value++);
   	   	 }
   	   }
   	   table=new JTable(data,name);
   	   table.setPreferredScrollableViewportSize(new Dimension(400,80));
   	   table.setCellSelectionEnabled(true);//使得表格的选取是以cell为单位,而不是以列为单位.若你没有写此行,则在选取表格数
                                           //据时以整列为单位.
   	   selectionMode=table.getSelectionModel();//取得table的ListSelectionModel.
   	   selectionMode.addListSelectionListener(this);
   	   JScrollPane s=new JScrollPane(table);
   	   JPanel panel=new JPanel();
   	   JButton b=new JButton("单一选择");
   	   panel.add(b);
   	   b.addActionListener(this);
   	   b=new JButton("连续区间选择");
   	   panel.add(b);
   	   b.addActionListener(this);
   	   b=new JButton("多重选择");   	   
   	   panel.add(b);
   	   b.addActionListener(this);
   	   
   	   label=new JLabel("你选取:");
   	   
   	   Container contentPane=f.getContentPane();
   	   contentPane.add(panel,BorderLayout.NORTH);
   	   contentPane.add(s,BorderLayout.CENTER);
   	   contentPane.add(label,BorderLayout.SOUTH);
   	   
   	   f.setTitle("SelectionModelDemo");
   	   f.pack();
   	   f.setVisible(true);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });   	   
   }
   /*处理按钮事件,利用ListSelectionModel界面所定义的setSelectionMode()方法来设置表格选取模式.*/
   public void actionPerformed(ActionEvent e){
   	  if (e.getActionCommand().equals("单一选择"))
   	     selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
   	  if (e.getActionCommand().equals("连续区间选择"))
   	     selectionMode.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
   	  if (e.getActionCommand().equals("多重选择"))
   	     selectionMode.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
   	  table.revalidate();
   }    

   /*当用户选取表格数据时会触发ListSelectionEvent,我们实现ListSelectionListener界面来处理这一事件.ListSelectionListener界
    *面只定义一个方法,那就是valueChanged().
    */ 	
   public void valueChanged(ListSelectionEvent el){
   	  String tempString="";
       //JTable的getSelectedRows()与getSelectedColumns()方法会返回已选取表格cell的index Array数据.
   	  int[] rows=table.getSelectedRows();
   	  int[] columns=table.getSelectedColumns();

       //JTable的getValueAt()方法会返回某行的cell数据,返回值是Object数据类型,因此我们要自行转成String数据类型.
   	    for (int i=0;i<rows.length;i++){
   	      for (int j=0;j<columns.length;j++)
                tempString = tempString+" "+(String)table.getValueAt(rows[i], columns[j]);      
   	    }
   	   label.setText("你选取:"+tempString);
   }
   public static void main(String[] args){
   	  new SelectionModelDemo();
   }
}
说明:
      在此范例中,我们要处理ActionEvent与ListSelectionEvent,因此在程序中我们要实现ActionListenrer与ListSelectionListener界
      面,而ListSelectionEvent是属于Swing事件,因此程序中我们要import javax.swing.event package进来.
    

8-6:DefaultTableModel
    我们曾提到过DefaultTableModel类,并说明了此类是继承AbstractTableModel抽象类而来,且实现了getColumnCount(),getRowCount()
与getValueAt()3个方法.因此在实际的使用上,DefaultTableModel比AbstractTableModel要来得简单许多,也较常被拿来使用
.DefaultTableModel内部使用Vector来使用表格的数据,若佻所要显示的表格格式是比较单纯的变化,笔者建议使用DefaultTableModel类会
来得方便也简单许多.若佻所要显示的数据模式非常复杂,例如我们所举的成绩表格外加学生选课信息等,像这类的表格通常显示的信息会因
人面异,因此使用AbstractTableModel会比较容易设计些.

下面是DefaultTableModel的构造函数:
    DefaultTableModel():建立一个DefaultTableModel,里面没有任何数据.
    DefaultTableModel(int numRows,int numColumns):建立一个指定行列数的DefaultTableModel.
    DefaultTableModel(Object[][] data,Object[] columnNames):建立一个DefaultTableModel,输入数据格式为Object Array.系统会
                                       自动调用setDataVector()方法来设置数据。
    DefaultTableModel(Object[] columnNames,int numRows):建立一个DefaultTableModel,并具有Column Header名称与行数信息。
    DefaultTableModel(Vector columnNames,int numRows):建立一个DefaultTableModel,并具有column Header名称与行数信息。
    DefaultTableModel(Vector data,Vector columnNames):建立一个DefaultTableModel,输入数据格式为Vector.系统会自动调用
                                        setDataVector()方法来设置数据。
   
  DefaultTableModel类提供相当多好用的方法,如之前我们谈论过的getColumnCount(),getRowCount(),getValueAt(),isCellEditable()
setValueAt()等方法,均可直接使用。且DefaultTableModel也提供了addColumn()与addRow()等方法,可让我们随时增加表格的数据。下
面我们就举一个动态增加表格字段的例子:

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class AddRemoveCells implements ActionListener
{
    JTable table = null;
    DefaultTableModel defaultModel = null;

    public AddRemoveCells()
    {
       	JFrame f = new JFrame();
       	String[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
       	String[][] data = new String[5][5];
       	int value =1;
       	for(int i=0; i<data.length; i++)
       	{
       	    for(int j=0; j<data[i].length ; j++)
       	        data[i][j] = String.valueOf(value++);
        }
         	        
       	defaultModel = new DefaultTableModel(data,name);
       	table=new JTable(defaultModel);
       	table.setPreferredScrollableViewportSize(new Dimension(400, 80));
        JScrollPane s = new JScrollPane(table);
        
        JPanel panel = new JPanel();
        JButton b = new JButton("增加行");
        panel.add(b);
        b.addActionListener(this);
        b = new JButton("增加列");
        panel.add(b);
        b.addActionListener(this);
        b = new JButton("删除行");
        panel.add(b);
        b.addActionListener(this);
        b = new JButton("删除列");
        panel.add(b);
        b.addActionListener(this);
        
        Container contentPane = f.getContentPane();
        contentPane.add(panel, BorderLayout.NORTH);
        contentPane.add(s, BorderLayout.CENTER);
        
	    f.setTitle("AddRemoveCells");
        f.pack();
        f.setVisible(true);
        
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    /*要删除列必须使用TableColumnModel界面定义的removeColumn()方法。因此我闪先由JTable类的getColumnModel()方法取得
     *TableColumnModel对象,再由TableColumnModel的getColumn()方法取得要删除列的TableColumn.此TableColumn对象当作是
     *removeColumn()的参数。删除此列完毕后必须重新设置列数,也就是使用DefaultTableModel的setColumnCount()方法来设置。
     */
    public void actionPerformed(ActionEvent e)
    {
        if(e.getActionCommand().equals("增加列"))
            defaultModel.addColumn("增加列");
        if(e.getActionCommand().equals("增加行"))
            defaultModel.addRow(new Vector());
        if(e.getActionCommand().equals("删除列"))
        {
            int columncount = defaultModel.getColumnCount()-1;
            if(columncount >= 0)//若columncount<0代表已经没有任何列了。
            {
                TableColumnModel columnModel = table.getColumnModel();
                TableColumn tableColumn = columnModel.getColumn(columncount);
                columnModel.removeColumn(tableColumn);
                defaultModel.setColumnCount(columncount);
            }
        }
        if(e.getActionCommand().equals("删除行"))
        {
            int rowcount = defaultModel.getRowCount()-1;//getRowCount返回行数,rowcount<0代表已经没有任何行了。
            if(rowcount >= 0)
            {
                defaultModel.removeRow(rowcount);
                defaultModel.setRowCount(rowcount);//删除行比较简单,只要用DefaultTableModel的removeRow()方法即可。删除
                 //行完毕后必须重新设置列数,也就是使用DefaultTableModel的setRowCount()方法来设置。
            }
        }
        table.revalidate();
    }
    
    public static void main(String args[]) {
        new AddRemoveCells();
    }
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -