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);
    }
}

执行结果如下图所示:

posted @ 2017-11-20 20:55  tiger_yj  阅读(893)  评论(0编辑  收藏  举报