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

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

📁 table小例子 table小例
💻 TXT
📖 第 1 页 / 共 3 页
字号:
        return p.length;
    }
    public String getColumnName(int col) {
        return n[col];
    }
    public Object getValueAt(int row, int col) {
        return p[row][col];
    }
	public Class getColumnClass(int c) {
	    return getValueAt(0, c).getClass();
	}
}

   上例中表格内的数据类型不论是String,int或是Boolean类型,都均以string的类型显示.例如在及格的字段中,原本的数据是以Boolean
类型来表示,但显示在JTable上时便转换成字符串形式,若想要使表格能显示出不同的数据类型,我们要在MyTable中Override写getColumnCl
ass()方法,这个方法可以让我们分辨出表格中每一行的数据类型,并将此类型作适当的显示:
	public Class getColumnClass(int c) {
	    return getValueAt(0, c).getClass();
	}
  这样"作弊"会以Check Box显示,数据类型一律靠右显示,String类型一律靠左显示.
TableModel2.java
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TableModel2 implements ActionListener{
     
    JTable t = null;
    
    public TableModel2() {
    
       	JFrame f = new JFrame("DataModel");
       	JButton b1 = new JButton("数学老师");
       	b1.addActionListener(this);
       	JButton b2 = new JButton("学生阿呆");
       	b2.addActionListener(this);
       	JPanel panel = new JPanel();
       	panel.add(b1);
       	panel.add(b2);
       	
       	t=new JTable(new MyTable(1));
       	t.setPreferredScrollableViewportSize(new Dimension(550, 30));
        JScrollPane s = new JScrollPane(t);
        
        f.getContentPane().add(panel, BorderLayout.NORTH);
        f.getContentPane().add(s, BorderLayout.CENTER);
        f.pack();
        f.setVisible(true);
        
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    
    public void actionPerformed(ActionEvent e)
    {
        if (e.getActionCommand().equals("学生阿呆"))
            t.setModel(new MyTable(1));
        if (e.getActionCommand().equals("数学老师"))
            t.setModel(new MyTable(2));
        t.revalidate();
    }
        
    public static void main(String args[]) {
    
        new TableModel2();
    }
}

class MyTable extends AbstractTableModel{

    Object[][] p1 = {
        {"阿呆", "1234",new Integer(66), 
          new Integer(50), new Integer(116), new Boolean(false),new Boolean(false)}};

    String[] n1 = {"姓名","学号","语文","数学","总分","及格","作弊"};
    
    Object[][] p2 = {
        {"阿呆", "1234",new Integer(50), new Boolean(false),new Boolean(false),"01234"},
        {"阿瓜", "1235",new Integer(75), new Boolean(true),new Boolean(false),"05678"}};

    String[] n2 = {"姓名","学号","数学","及格","作弊","电话"};
    
    int model = 1;
    
    public MyTable(int i){
        model = i;
    }
        
    public int getColumnCount() {
        if(model ==1)
            return n1.length;
        else
            return n2.length;
    }

    public int getRowCount() {
        if(model ==1)
            return p1.length;
        else
            return p2.length;
    }

    public String getColumnName(int col) {
        if(model ==1)
            return n1[col];
        else
            return n2[col];
    }

    public Object getValueAt(int row, int col) {
        if(model == 1)
            return p1[row][col];
        else
            return p2[row][col];
    }
    
	public Class getColumnClass(int c) {
	    return getValueAt(0, c).getClass();
	}
}


8-4:TableColumnModel:
   TableColumnModel本身是一个Interface,里面定义了许多与表格的"列(行)"有关的方法,例如增加列,删除列,设置与取得"列"的相关信
息.通常我们不会直接实现TableColumnModel界面,而是会利用JTable的getColumnModel()方法取得TableColumnModel对象,再利用此对象对
字段做设置.举例来说,如果我们想设计的表格是包括有下拉式列表的Combo Box,我们就能利用TableColumnModel来达到这样的效果.
 我们先看看下面的例子:
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ColumnModelTest{
     
    public ColumnModelTest() {
    
   	JFrame f = new JFrame();
   /*由于我们的MyTable类继承了AbstractTableModel并且实作了getColmunCount(),getRowCount(),getValueAt()方法.因此我们可以通
    *过MyTable来产生TableModel的实体.
    */ 
   	MyTable mt=new MyTable();
   	JTable t=new JTable(mt);//我们利用MyTable来建立JTable.
   	JComboBox c = new JComboBox();//建立一个JComboBox的对象.
   	c.addItem("Taipei");//我们在新建立的JComboBox对象里新增三个项目.
   	c.addItem("ChiaYi");
   	c.addItem("HsinChu");
    /*我们利用JTable所提供的getTableColumnModel()方法取得TableColumnModel对象,再由TableColumnModel类所提供的getColumn()方
     *法取得TableColumn对象,TableColumn类可针对表格中的每一行做具体的设置,例如设置字段的宽度,某行的标头,设置输入较复杂的
     *数据类型等等.在这里,我们利用TableColumn类所提供的setCellEditor()方法,将JComboBox作为第二行的默认编辑组件.
     */
   	t.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c));
   	t.setPreferredScrollableViewportSize(new Dimension(550, 30));
        JScrollPane s = new JScrollPane(t);
        
        f.getContentPane().add(s, BorderLayout.CENTER);
	    f.setTitle("ColumnModelTest");
        f.pack();
        f.setVisible(true);
        
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String args[]) {
    
        new ColumnModelTest();
    }
      
}

class MyTable extends AbstractTableModel{

        Object[][] p = {
            {"阿呆", "Taipei",new Integer(66), 
              new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},
            {"阿瓜", "ChiaYi",new Integer(85), 
              new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},          
        };

        String[] n = {"姓名", 
        	         "居住地",
                      "语文",
                      "数学",
                      "总分",
                      "及格",			         
                      "作弊"};
    
        public int getColumnCount() {
            return n.length;
        }

        public int getRowCount() {
            return p.length;
        }

        public String getColumnName(int col) {
            return n[col];
        }

        public Object getValueAt(int row, int col) {
            return p[row][col];
        }
	    public Class getColumnClass(int c) {
        	return getValueAt(0, c).getClass();
    	}
	    /*public boolean isCellEditable(int rowIndex, int columnIndex) {
		    return true;	
    	}
	    public void setValueAt(Object value, int row, int col) {
        	p[row][col] = value;
		    fireTableCellUpdated(row, col);
    	}*/
}

   读者运行此程序可以发现,利用继承AbstractTableModel抽象类所产生的JTable的内容是不能被修改的.那如果想要让用户可以修改表格
中的某一个字段,例如勾选Check Box或是直接修改某个字段的数字,该怎么做呢?很简单,只要我们在范例中的MyTable类中覆写AbstractTab
leModel抽象类中的isCellEditable()方法即可.下面即是isCellEditable()的实作:
    public boolean isCellEditable(int rowIndex,int columnIndex){
           return true;
    }
   在isCellEditable()中,我们只有一行简单的程序代码:return true,意思是将我们表格内的每个cell都变成可修改.但仅仅修改这个程
序代码还不行,你可以发现虽然表格现在变成了可以修改了,但更改完之后按下[Enter]键,内容马上恢复成原有的值!解决的方法是覆写
AbstractTableModel抽象类中的setValueAt()方法,这个方法主要是让我们将改过的值存入表格中,如下所示:
   public void setValueAt(Object value,int row,int col){

⌨️ 快捷键说明

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