JTable,仿Outlook界面

import   javax.swing.JFrame;  
import   javax.swing.JPanel;  
import   javax.swing.JScrollPane;  
import   javax.swing.JTable;  
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

import java.awt.Component;
import   java.awt.Dimension;  
import   java.awt.GridLayout;  
import   java.awt.event.MouseAdapter;  
import   java.awt.event.MouseEvent;  
import java.lang.Runnable;
import java.awt.Font;

public   class   SimpleTableDemo   extends   JPanel   {  
    private   boolean   DEBUG   =   false;  

    public   SimpleTableDemo()   {  
        super(new   GridLayout(1,0));  

        String[]   columnNames   =   {"First   Name",  
                "Last   Name",  
                "Sport",  
                "#   of   Years",  
        "Vegetarian"};  

        Object[][]   data   =   {  
                {"Mary",   "Campione",  
                    "Snowboarding",   new   Integer(5),   new   Boolean(true)},  
                    {"Alison",   "Huml",  
                        "Rowing",   new   Integer(3),   new   Boolean(true)},  
                        {"Kathy",   "Walrath",  
                            "Knitting",   new   Integer(2),   new   Boolean(true)},  
                            {"Sharon",   "Zakhour",  
                                "Speed   reading",   new   Integer(20),   new   Boolean(true)},  
                                {"Philip",   "Milne",  
                                    "Pool",   new   Integer(10),   new   Boolean(true)}  
        };  

        final   JBoldTable   table   =   new   JBoldTable(data,   columnNames);  
        table.setPreferredScrollableViewportSize(new   Dimension(500,   70));  

        if   (DEBUG)   {  
            table.addMouseListener(new   MouseAdapter()   {  
                public   void   mouseClicked(MouseEvent   e)   {  
                    printDebugData(table);  
                }  
            });  
        }  

        //Create   the   scroll   pane   and   add   the   table   to   it.  
        JScrollPane   scrollPane   =   new   JScrollPane(table);  

        //Add   the   scroll   pane   to   this   panel.  
        add(scrollPane);  
    }  

    private   void   printDebugData(JTable   table)   {  
        int   numRows   =   table.getRowCount();  
        int   numCols   =   table.getColumnCount();  
        javax.swing.table.TableModel   model   =   table.getModel();  

        System.out.println("Value   of   data:   ");  
        for   (int   i=0;   i   <   numRows;   i++)   {  
            System.out.print("         row   "   +   i   +   ":");  
            for   (int   j=0;   j   <   numCols;   j++)   {  
                System.out.print("     "   +   model.getValueAt(i,   j));  
            }  
            System.out.println();  
        }  
        System.out.println("--------------------------");  
    }  

    /**  
     *   Create   the   GUI   and   show   it.     For   thread   safety,  
     *   this   method   should   be   invoked   from   the  
     *   event-dispatching   thread.  
     */  
    private   static   void   createAndShowGUI()   {  
        //Make   sure   we   have   nice   window   decorations.  
        //JFrame.setDefaultLookAndFeelDecorated(true);  

        //Create   and   set   up   the   window.  
        JFrame   frame   =   new   JFrame("SimpleTableDemo");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

        //Create   and   set   up   the   content   pane.  
        SimpleTableDemo   newContentPane   =   new   SimpleTableDemo();  
        newContentPane.setOpaque(true);   //content   panes   must   be   opaque  
        frame.setContentPane(newContentPane);  

        //Display   the   window.  
        frame.pack();  
        frame.setVisible(true);  
    }  

    public   static   void   main(String[]   args)   {  
        //Schedule   a   job   for   the   event-dispatching   thread:  
        //creating   and   showing   this   application's   GUI.  
        javax.swing.SwingUtilities.invokeLater(new   Runnable()   {  
            public   void   run()   {  
                createAndShowGUI();  
            }  
        });  
    }  
}  

class JBoldTable extends JTable implements ListSelectionListener{
    MyBold bold = new MyBold(this);
    Thread td = new Thread(bold);
    boolean checkRun = false;
    int row = -1;
    public JBoldTable(Object[][] data, Object[] column) {
        super(data, column);
        setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {         
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                // TODO 自动生成方法存根
                super.getTableCellRendererComponent(table, value, isSelected,
                        hasFocus, row, column);
                Boolean bFlag = (Boolean)getValueAt(row, 4);
                int nFlag = 0;
                if (bFlag) {
                    nFlag = Font.BOLD;
                }
                Font font = new Font("宋体", nFlag, 12);
                setFont(font);
                return this;
            }

        });
        getSelectionModel().addListSelectionListener(this);

    }


    public void valueChanged(ListSelectionEvent e) {
        // TODO 自动生成方法存根
        repaint();
        if (row != getSelectedRow()) {
            row = getSelectedRow();

            if (td.isAlive()) {
                bold.stop();
                try {
                    td.join();
                } catch (InterruptedException e1) {
                    // TODO 自动生成 catch 块
                    e1.printStackTrace();
                }
            }
            bold.start();
            td = new Thread(bold);
            td.start();


        }
    }   

    class MyBold implements Runnable {
        private JTable table;
        volatile boolean isStop = false;

        public MyBold(JTable table) {
            this.table = table;
        }

        public  void start() {
            isStop = false;
        }

        public  void stop() {
            isStop = true;
        }

        public synchronized void run() {
            // TODO 自动生成方法存根
            int row1 = table.getSelectedRow();
            for (int i = 0; i < 1000; ++i) {
                try {
                    Thread.sleep(1);
                    if (isStop)
                        return;
                } catch (InterruptedException e) {
                    // TODO 自动生成 catch 块
                    e.printStackTrace();
                }
            }
            int row2 = table.getSelectedRow();
            if (row1 != row2)
                return;
            Boolean bFlag = (Boolean) table.getValueAt(row1, 4);
            if (!bFlag)
                return;
            table.setValueAt((Object)(new Boolean(!bFlag.booleanValue())), row1, 4);
            table.repaint();
            //table.updateUI();
        }
    }
}
在Java界面中使用JTable组件进行数据修改是相对简单的。以下是具体的步骤: 1. 创建一个JFrame窗口,用于显示JTable组件。 2. 创建一个TableModel类,用于存储和管理JTable中的数据。TableModel是一个接口,你可以自己实现它,或者使用已有的DefaultTableModel类。 3. 使用TableModel类的构造函数创建一个TableModel对象,并将其与JTable关联。 4. 在TableModel对象中添加需要显示的列和行的数据。 5. 将JTable对象添加到JFrame窗口中。 6. 为JTable对象添加一个可编辑的CellEditor,以允许用户对数据进行修改。你可以使用默认的TableCellEditor类,也可以自定义一个。 7. 通过TableModel类的方法,监听用户的操作事件,例如按下回车键或者点击确认按钮。 8. 使用TableModel类的方法,获取用户修改后的数据,并在内部更新数据。 9. 在TableModel对象中的setValueAt()方法中,使用新值更新数据模型。 10. 最后,刷新JTable,以确保用户修改后的数据能够更新并显示在界面上。 总结: 使用JTable进行数据修改的过程可以分为创建JFrame窗口、创建和设置TableModel对象、以及更新数据模型和刷新JTable。通过监听用户的操作事件,获取用户修改后的数据,并更新数据模型,从而实现数据的修改功能。在具体操作中,你可以根据需要自定义CellEditor,并对JTable的外观进行调整,以适应不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值