JTable的添加行插入行以及JTable的单击和双击事件

来源:互联网 发布:淘宝怎么搜索小电影 编辑:程序博客网 时间:2024/04/29 08:18
package test.table;

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

public class JTableTest extends JFrame {

 class TableTableModel extends DefaultTableModel {
  /**
   * 
   */
  private static final long serialVersionUID = 679265889547674796L;
  public final String[] COLUMN_NAMES = new String[] {"列0", "列1", "列2", "列3"};
  
  public TableTableModel()
  {
  }

  public int getColumnCount() {
   return COLUMN_NAMES.length;
  }
  public String getColumnName(int columnIndex) {
   return COLUMN_NAMES[columnIndex];
  }
  // 将Table设成只读的
  public boolean isCellEditable(int row,
                int column)
  {
   return false;
  }
 }

 private JTable table;
 private int i = 0;
 private int j = 0;
 private int rowI = -1;
 /**
  * Launch the application
  * @param args
  */
 public static void main(String args[]) {
  try {
   JTableTest frame = new JTableTest();
   frame.setVisible(true);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * Create the frame
  */
 public JTableTest() {
  super();
  setTitle("JTable Test");
  getContentPane().setLayout(null);
  setBounds(100, 100, 500, 375);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  final JScrollPane scrollPane = new JScrollPane();
  scrollPane.setBounds(10, 28, 460, 271);
  getContentPane().add(scrollPane);

  table = new JTable();
  table.setShowGrid(true);
  table.addMouseListener(new UserMouseAdapter() {
   /** *//**
      * 鼠标单击事件
      * @param e 事件源参数
      */
   public void mouseSingleClicked(MouseEvent e){
       //System.out.println("Single Clicked!");
    rowI  = table.rowAtPoint(e.getPoint());// 得到table的行号
    if (rowI > -1)
        System.out.println("单击鼠标 "+((TableTableModel)table.getModel()).getValueAt(rowI, 0));
     }

     /** *//**
      * 鼠标双击事件
      * @param e 事件源参数
      */
     public void mouseDoubleClicked(MouseEvent e){
       //System.out.println("Doublc Clicked!");
      rowI  = table.rowAtPoint(e.getPoint());// 得到table的行号
     if (rowI > -1)
         System.out.println("双击鼠标 "+((TableTableModel)table.getModel()).getValueAt(rowI, 0));
     }
     
  });
  table.setModel(new TableTableModel());
  scrollPane.setViewportView(table);

  final JButton button = new JButton();
  button.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent arg0) {
    ((TableTableModel)table.getModel()).addRow(new String[] {"行"+(i++),"含一","行2","行3"});
   }
  });
  button.setText("添加一行");
  button.setBounds(10, 308, 99, 23);
  getContentPane().add(button);

  final JButton button_1 = new JButton();
  button_1.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent arg0) {
    ((TableTableModel)table.getModel()).insertRow((rowI>=0?rowI:0),new String[] {"插入行"+(j++),"插入行1","插入行2","插入行3"});
   }
  });
  button_1.setText("插入行");
  button_1.setBounds(121, 308, 99, 23);
  getContentPane().add(button_1);

 }

}


//UserMouseAdapter.java

package test.table;

import java.awt.event.*;
/**
 *用定时器延时单击事件实现鼠标双击事件,单击和双击事件互不影响! 
 */
public class UserMouseAdapter
    extends java.awt.event.MouseAdapter {
 
  private boolean flag=false;//用来判断是否已经执行双击事件
  private int clickNum=0;//用来判断是否该执行双击事件

  public void mouseClicked(MouseEvent e) {
      final MouseEvent me=e;//事件源

      this.flag=false;//每次点击鼠标初始化双击事件执行标志为false

      if (this.clickNum == 1) {//当clickNum==1时执行双击事件
        this.mouseDoubleClicked(me);//执行双击事件
        this.clickNum=0;//初始化双击事件执行标志为0
        this.flag=true;//双击事件已执行,事件标志为true
        return;
      }

      //定义定时器
      java.util.Timer timer=new java.util.Timer();

      //定时器开始执行,延时0.2秒后确定是否执行单击事件
      timer.schedule(new java.util.TimerTask(){
        private int n=0;//记录定时器执行次数
        public void run() {
          if(flag){//如果双击事件已经执行,那么直接取消单击执行
            n=0;
            clickNum=0;
            this.cancel();
            return;
          }
          if (n == 1) {//定时器等待0.2秒后,双击事件仍未发生,执行单击事件
            mouseSingleClicked(me);//执行单击事件
            flag = true;
            clickNum=0;
            n=0;
            this.cancel();
            return;
          }
          clickNum++;
          n++;
        }
      },new java.util.Date(),200); // 设置延迟时间
    }

    /** *//**
     * 鼠标单击事件
     * @param e 事件源参数
     */
    public void mouseSingleClicked(MouseEvent e){
      //System.out.println("Single Clicked!");
    }

    /** *//**
     * 鼠标双击事件
     * @param e 事件源参数
     */
    public void mouseDoubleClicked(MouseEvent e){
      //System.out.println("Doublc Clicked!");
    }
}

 
原创粉丝点击