Java表格事件及线程示例
范例1. 表格模型事件
当向表格模型中添加行时,或者是修改或删除表格模型中的现有行时,将发出表格模型事件(TableModelEvent)。示例代码如下:
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; public class TableModelEvent_Example extends JFrame { private JTable table; private DefaultTableModel tableModel; private JTextField aTextField; private JTextField bTextField; public static void main(String[] args) { // TODO Auto-generated method stub TableModelEvent_Example frame=new TableModelEvent_Example(); frame.setVisible(true); } public TableModelEvent_Example() { super(); setTitle("表格模型事件示例"); setBounds(320, 260, 575, 325); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container=getContentPane(); final JScrollPane scrollPane=new JScrollPane(); container.add(scrollPane, BorderLayout.CENTER); String[] columnsNames= {"A","B"}; String[][] rowValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"},{"A4","B4"}}; //创建表格模型对象 tableModel=new DefaultTableModel(rowValues,columnsNames); //为表格模型添加事件监听器 tableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { int type = e.getType(); //获取事件的类型 int row=e.getFirstRow()+1; //获得触发此次事件的表格行索引 int column=e.getColumn()+1; //获得触发此次事件的表格列索引 if(type==TableModelEvent.INSERT) { //判断是否由插入行触发 System.out.println("此次事件由 插入 行触发"); System.out.println("此次插入的是第"+row+"行!"); }else if(type==TableModelEvent.UPDATE) { System.out.println("此次事件由 修改 行触发"); System.out.println("此次修改的是第"+row+"行!"); }else if (type==TableModelEvent.DELETE) { System.out.println("此次事件由 删除 行触发"); System.out.println("此次删除的是第"+row+"行!"); }else { System.out.println("此次事件由 其他原因 触发"); } } }); table=new JTable(tableModel); //利用表格模型对象创建表格对象 scrollPane.setViewportView(table); final JPanel panel=new JPanel(); container.add(panel, BorderLayout.SOUTH); final JLabel aLabel=new JLabel("A:"); panel.add(aLabel); aTextField=new JTextField(15); panel.add(aTextField); final JLabel bLabel=new JLabel("B:"); panel.add(bLabel); bTextField=new JTextField(15); panel.add(bTextField); final JButton addButton=new JButton("添加"); addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String[] rowValues= {aTextField.getText(),bTextField.getText()}; tableModel.addRow(rowValues); //向表格模型中添加一行 aTextField.setText(null); bTextField.setText(null); } }); panel.add(addButton); final JButton delButton=new JButton("删除"); delButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int[] selectedRows=table.getSelectedRows(); //获得表格中的选中行 for(int row=0;row<selectedRows.length;row++) { tableModel.removeRow(selectedRows[row]-row); //从表格模型中移除表格中的选中行 } } }); panel.add(delButton); } }
范例2. 线程的休眠
一种能控制线程行为的方法是调用sleep()方法。sleep()方法需要一个参数用于指定该线程休眠的时间,该时间使用毫秒为单位。
sleep()方法的语法格式如下:
try{
Thread.sleep(1000);
} catch(InterruptedException e){
e.printStackTrace();
}
具体示例代码如下:
import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; public class SleepMethodDemo extends JFrame { private Thread t; //定义颜色数组 private static Color[] color= {Color.BLACK,Color.BLUE,Color.CYAN, Color.GREEN,Color.ORANGE,Color.YELLOW,Color.RED,Color.PINK, Color.LIGHT_GRAY}; private static final Random rand=new Random(); //创建随机对象 private Color getC() { //获取随机颜色值的方法 return color[rand.nextInt(color.length)]; } public SleepMethodDemo() { //创建匿名线程对象 t=new Thread(new Runnable() { int x=30; //定义初始坐标 int y=60; public void run() { //覆盖线程接口方法 while(true) { //无限循环 try { t.sleep(150); //线程休眠0.15秒 } catch(InterruptedException e) { e.printStackTrace(); } Graphics gp=getGraphics(); //获取组件绘图上下文对象 gp.setColor(getC()); //设置绘图颜色 gp.drawLine(x, y, 100, y++); //绘制直线并递增垂直坐标 if(y>=100) { y=60; } } } }); t.start(); //启动线程 } public static void main(String[] args) { // TODO Auto-generated method stub init(new SleepMethodDemo(),150,150); } public static void init(JFrame jf,int width,int height) { //初始化程序界面的方法 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(width, height); jf.setVisible(true); } }
执行代码显示如下图所示:
范例3. 线程的加入
如果当前某程序为多线程程序,假如存在一个线程A,现在需要加入线程B,并要求线程B先执行完毕,然后再执行线程A,此时可以使用
Thread类中的join()方法来完成。示例代码如下:
import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JProgressBar; public class ThreadJoin extends JFrame { private Thread tA; //定义两个线程 private Thread tB; final JProgressBar pb=new JProgressBar(); //定义两个进度条组件 final JProgressBar pb2=new JProgressBar(); int count=0; public static void main(String[] args) { // TODO Auto-generated method stub init(new ThreadJoin(),200,200); } public ThreadJoin() { super(); Container cp=getContentPane(); cp.add(pb,BorderLayout.NORTH); //将进度条设置在窗体的最北面 cp.add(pb2, BorderLayout.SOUTH); //将进度条设置在窗体最南面 pb.setStringPainted(true); //设置进度条显示数字字符 pb2.setStringPainted(true); //使用匿名内部类形式初始化Thread实例 tA=new Thread(new Runnable() { int count=0; public void run() { while(true) { pb.setValue(++count); //设置进度条的当前值 try { tA.sleep(200); //使线程tA休眠0。2秒 tB.join(); //使线程tB调用join()方法 } catch(Exception e) { e.printStackTrace(); } } } }); tA.start(); //启动线程tA tB=new Thread(new Runnable() { int count=0; public void run() { while(true) { pb2.setValue(++count); //设置进度条的当前值 try { tB.sleep(200); //线程tB休眠200毫秒 } catch (Exception e) { e.printStackTrace(); } if (count==100) { //当count变量增长为100时 break; //跳出循环 } } } }); tB.start(); //启动线程tB } //设置窗体各种属性方法 public static void init(JFrame jf,int width,int height) { jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(width,height); jf.setVisible(true); } }
执行结果显示如下图所示:
范例4. 线程的查看和修改示例
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class ThreadPriority extends JFrame implements Runnable { private JTable table; private DefaultTableModel model; private JTextField textField; @Override public void run() { while(true) { try { Thread.sleep(100); }catch(InterruptedException e) { e.printStackTrace(); } } } public void do_this_windowActivated(WindowEvent e) { ThreadGroup group=Thread.currentThread().getThreadGroup(); //获得当前线程所在线程组 Thread[] threads=new Thread[group.activeCount()]; //使用数组保存活动状态的线程 group.enumerate(threads); //获得所有线程 DefaultTableModel model=(DefaultTableModel)table.getModel(); //获得表格模型 model.setRowCount(0); //清空表格模型中的数据 //定义表头 model.setColumnIdentifiers(new Object[] {"线程ID","线程名称","优先级"}); for(Thread thread:threads) { //增加行数据 model.addRow(new Object[] {thread.getId(),thread.getName(),thread.getPriority()}); } table.setModel(model); //更新表格模型 } //编写do_button_actionPerformed()方法,用来监听单击"修改"按钮事件。 //在该方法中,获得用户输入的优先级和用户选择的行,根据用户输入的优先级修改了线程优先级。 protected void do_button_actionPerformed(ActionEvent e) { String text=textField.getText(); //获得用户输入的优先级 Integer priority=Integer.parseInt(text); //将优先级转换成Integer对象 int selectedRow=table.getSelectedRow(); //获得用户选择的行 DefaultTableModel model=(DefaultTableModel)table.getModel(); //获得默认表格模型 model.setValueAt(priority, selectedRow, 2); //更改表格中的数据 repaint(); //重新绘制各个控件 } public void repaint() { textField.setText(null); } public static void main(String[] args) { // TODO Auto-generated method stub ThreadPriority frame=new ThreadPriority(); frame.setVisible(true); } public ThreadPriority() { super(); setTitle("查看和修改优先级"); setBounds(320,260,500,375); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container cp=getContentPane(); final JScrollPane scrollPane=new JScrollPane(); cp.add(scrollPane, BorderLayout.CENTER); String[] columnsName={"线程ID","线程名称","优先级"}; model=new DefaultTableModel(null,columnsName); table=new JTable(model); scrollPane.setViewportView(table); addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { do_this_windowActivated(e); } }); final JPanel jp=new JPanel(); cp.add(jp, BorderLayout.SOUTH); final JLabel jl=new JLabel("新优先级(1~10):"); jp.add(jl); textField=new JTextField(15); jp.add(textField); final JButton do_button=new JButton("修改"); do_button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_button_actionPerformed(e); } }); jp.add(do_button); } }
执行结果如下图所示: