三大控件之————JTabel

来源:互联网 发布:知乎 柳岩 编辑:程序博客网 时间:2024/06/16 13:50

                                               JTabel的使用
重点: 一般以模型方法创建表格:
         DefaultTableModel model = new DefaultTableModel(data, colName);
    
       设置表格中的的某一列具有按钮作用
           MyCellEditor cellediter=new MyCellEditor(new JTextField()); 
 
       表格的渲染器
           MyTableCellRenderer cellrender = new MyTableCellRenderer();

        给表格增加一行数组  (直接操作其对应的模型)
               model.addRow(new String[]{str1,str2});

        设置当前表格中某一具体格的文本
           table.getModel().setValueAt(str, row, col);  

  

 

 

     具体使用可以查看下面的方法:
   

********************************************************************************************
public class MainFrame extends JFrame {

  private JTable table;
  private DefaultTableModel model;
 
  private  MyCellEditor cellediter=new MyCellEditor(new JTextField());
  private  MyTableCellRenderer cellrender = new MyTableCellRenderer();
 
 String colName[] = {"添加","姓名","年龄"};    //一维数组为表格的表头部分
 String data[][] = {                            //二维数组为表格的数据
  {"添加","DAWEI","16"},
  {"添加","LILY","14"},
  {"添加","LUCY","12"}, 
  };
 
 MainFrame(){
     init();
     addTabel();
        }
 
 private void init() {
  setSize(500, 400);
  setResizable(false);
  setLocationRelativeTo(null);
  setDefaultCloseOperation(EXIT_ON_CLOSE); 
        }

       private void addTabel(){
     
     model = new DefaultTableModel(data, colName);               //用模型创建表格
     table = new JTable(model);
     
     table.getColumn("添加").setCellEditor(cellediter);          //给表格这一列设置事件
 table.getColumn("添加").setCellRenderer(cellrender);         //设置这一列表格的绘制风格
     
     
     JScrollPane jsp = new JScrollPane(table);
  add(jsp);
      }

 public static void main(String[] args) {
  new MainFrame().setVisible(true);
 }

}

*****************************************************************

public class MyCellEditor extends DefaultCellEditor{      //这个类相当于给表格写的按钮事件
                                                          //表格的这一列具有了按钮的功能
 public MyCellEditor(JTextField textField) {
  super(textField);
  setClickCountToStart(1);                //设置点击一次
 }
 
 public Component getTableCellEditorComponent(final JTable table, Object value,
   boolean isSelected, final int row, final int column) {
  JButton btn = new JButton();
  btn.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
    String str1 = JOptionPane.showInputDialog("请输入添加的名字");
    String str2 = JOptionPane.showInputDialog("请输入添加的年龄");
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    if(!str1.equals("") && !str2.equals("")){
    model.addRow(new String[]{str1,str2});         //给表格增加一行数据
    } 
   }
  });
  btn.setText(value.toString());                                 //点击后设置其文本
  return btn;
 }
}
*******************************************************************
                                                           //注:这个类为表格的渲染器,可以绘制表格的显示外观
                                                           //可以继承至JButton和JLabel等
public class MyTableCellRenderer extends JButton implements TableCellRenderer{
 
 public Component getTableCellRendererComponent(JTable table, Object value,
   boolean isSelected, boolean hasFocus, int row, int column) {
  this.setText(value.toString());
  return this;                             //由于继承自JButton,所以这里返回的是一个JButton的外观                      
 }
}

*******************************************************************

******************************************************************************************************
下面给出一个完整的例子:  用进度条的方式显示在表格中

public class MainFrame extends JFrame {
 
 MainFrame(){
  init();
 }
 private void init() {
  setSize(500, 300);
  setLocationRelativeTo(null);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  String colNames[] = {"aa","bb"};
  String data[][] = {
    {"0","开始"},
    {"0","开始"},
    {"0","开始"}
  };
  DefaultTableModel model = new DefaultTableModel(data,colNames); 
  JTable table = new JTable(model);
  MyCellEditor editor = new MyCellEditor(new JTextField());   //创建事件设置
  MyCellRenderder render = new MyCellRenderder();              //渲染器
  
                table.getColumn("aa").setCellRenderer(render);             //设置"aa"这一列显示为进度条
  table.getColumn("bb").setCellRenderer(render);             //设置"bb"这一列显示为按钮
  table.getColumn("bb").setCellEditor(editor);               //设置"bb"这一列显示为巨头按钮功能
  this.add(table);
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  new MainFrame().setVisible(true);
 }

}
********************************************
                                                        //另外也可以设置成具有下拉框JCombox的属性等。
public class MyCellEditor extends DefaultCellEditor {

 public MyCellEditor(JTextField arg0) {
  super(arg0);
  setClickCountToStart(1);
 }
 public Component getTableCellEditorComponent(final JTable table, Object value,
   boolean isSel, final int row, final int col) {
  JButton btn = new JButton(value.toString());
  btn.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
    JButton btn = (JButton) e.getSource();
    String string = btn.getText();
    MyCellRenderder render = (MyCellRenderder) table.getCellRenderer(row, col);
    render.begin(row);
    String str= string.equals("开始")?"重设":"重设";
    btn.setText(str);
    table.getModel().setValueAt(str, row, col);   //这里可以设置当前表格中某一具体格的文本
    
   }
  });
  return btn;
 }
 public boolean stopCellEditing() {
  return true;
 }

}
********************************************
                                                
public class MyCellRenderder extends DefaultTableCellRenderer{
 private ArrayList<MyProgressBar> mps = new ArrayList<MyProgressBar>();
 @Override
 public Component getTableCellRendererComponent(JTable table, Object value,
   boolean isSelected, boolean isFocus, final int row, final int col) {
  if(col == 0){
   MyProgressBar mp = new MyProgressBar(table,row);
   mp.setValue(Integer.parseInt(value.toString())); //设置进度条的文本为其显示的字体
   mps.add(mp);
   return mp;                            //如果是第一列,则绘制为进度条
  }else{
   JButton btn = new JButton(value.toString());
   return btn;                            //其他列绘制为JButton
    
  }
 }
 public void begin(int i){                         //这里是进度条的方法
  mps.get(i).start();                       //每次点击后,这一行的进度条开始读取
 }
 
}

********************************************
                            
public class MyProgressBar extends JProgressBar implements ActionListener {
 private Timer timer = new Timer(100,this);
 private int row;                                       //单独的一个进度条类,封装了开始设置其值的方法
 private JTable table;
 MyProgressBar(JTable table,int row){
  this.table = table;
  this.row = row;
  this.setStringPainted(true);
 }
 public void start(){
  this.setValue(0);
  table.getModel().setValueAt(0, row, 0);      //将当前表格的这一行的初始值设置为0
  timer.start();
 }
 @Override
 public void actionPerformed(ActionEvent e) {
  int value = getValue()+1;
  this.setValue(value);
  System.out.println(value);
  table.getModel().setValueAt(value, row, 0);   //设置当前表格这一行的进度条的值为value
 }
}

*********************************************************************************************************
JTabel的一些其他方法:

 
         String columnNames[] = {"姓名","性别","年龄"};
  String[][]data = {{"赵江1","男","12"},{"赵江2","女","13"},{"赵江3","男","14"},{"赵江4","女","15"}};
  //数据模型
  DefaultTableModel model = new DefaultTableModel(data, columnNames);
  //以model创建JTable对象
  JTable table = new JTable(model);
  
               //JTable的属性类 -列属性
  TableColumn column = table.getColumn("姓名");
  column.setPreferredWidth(80);
  column.setMaxWidth(80);
  column.setMinWidth(80);
  
                //对数据模型添加监听器
  model.addTableModelListener(this);
  
                //获取表格里面的值
  String str = model.getValueAt(3, 2).toString();
  System.out.println(str);
  
                //表格单元是否可以编辑
  boolean flag = model.isCellEditable(2, 2);
  System.out.println(flag);
  
                //JTabel 的对象即是表的选择模式设置       方式1
  table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

//  //JTabel 的对象即是表的选择模式设置       方式2
//  ListSelectionModel mode = new DefaultListSelectionModel();
//  mode.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
//  table.setSelectionModel(mode);


            public void tableChanged(TableModelEvent e) {       //表格模型监听所对应的函数
  int col = e.getColumn();
  int row = e.getFirstRow();
  DefaultTableModel mol = (DefaultTableModel) e.getSource();
  //判断对象是否是属于该类
  if(e.getSource() instanceof DefaultTableModel){
   System.out.println("agag");
  }
  System.out.println(col);
  System.out.println(row);
  System.out.println(mol.toString());
     }

*********************************************************************

 

 


 

原创粉丝点击