2025-02-10


[java]
package com.han; 
 
import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.InputEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.Arrays; 
import java.util.Vector; 
 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.TableModelEvent; 
import javax.swing.event.TableModelListener; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableColumnModel; 
 
/**
 * 表格模型事件示例
 * <p>
 * <li>A component generally gains the focus when the user clicks it, 
 * or when the user tabs between components, or otherwise interacts 
 * with a component. A component can also be given the focus programmatically,
 * such as when its containing frame or dialog-box is made visible. 
 * The snippet of the codes below shows how to give a particular component  
 * the focus every time the window gains the focus.
 * 
 * @author HAN
 * 
 */ 
public class TableModelEvent_1 extends JFrame { 
 
    /**
     * 
     */ 
    private static final long serialVersionUID = -8581492063632813033L; 
 
    public TableModelEvent_1() { 
        // TODO Auto-generated constructor stub  
        final Container container = getContentPane(); 
        Vector<String> tableColumnNames = new Vector<String>(); 
        tableColumnNames.add("A"); 
        tableColumnNames.add("B"); 
        Vector<Vector<String>> tableValues = new Vector<Vector<String>>(); 
        for (int i = 1; i < 5; i++) { 
            Vector<String> vector = new Vector<String>(); 
            vector.add("A" + i); 
            vector.add("B" + i); 
            tableValues.add(vector); 
        } 
        final DefaultTableModel defaultTableModel = new DefaultTableModel( 
                tableValues, tableColumnNames); 
        final JTable table = new JTable(defaultTableModel); 
        JScrollPane scrollPane = new JScrollPane(); 
        scrollPane.setViewportView(table); 
        container.add(scrollPane, BorderLayout.CENTER); 
        JPanel panel = new JPanel(); 
        container.add(panel, BorderLayout.SOUTH); 
        JLabel labelA = new JLabel("A: "); 
        final JTextField textFieldA = new JTextField(15); 
        JLabel labelB = new JLabel("B: "); 
        final JTextField textFieldB = new JTextField(15); 
        JButton buttonAdd = new JButton("添加"); 
        JButton buttonDel = new JButton("刪除"); 
        JButton buttonDeselected = new JButton("取消選擇"); 
        panel.add(labelA); 
        panel.add(textFieldA); 
        panel.add(labelB); 
        panel.add(textFieldB); 
        panel.add(buttonAdd); 
        panel.add(buttonDel); 
        panel.add(buttonDeselected); 
        buttonAdd.addActionListener(new ActionListener() { 
 
            @Override 
            public void actionPerformed(ActionEvent e) { 
                // TODO Auto-generated method stub  
                int[] selectedRows = table.getSelectedRows(); // table  
                                                                // 默認情況容許多行選擇  
                Vector<String> rowData = new Vector<String>(); 
                rowData.add(textFieldA.getText()); 
                rowData.add(textFieldB.getText()); 
                if (selectedRows.length == 0) { 
                    defaultTableModel.addRow(rowData); 
                    textFieldA.setText(null); 
                    textFieldB.setText(null); 
                } else if (selectedRows.length == 1) { 
//                  System.out.println(selectedRows[0]);  
                    defaultTableModel.insertRow(selectedRows[0] + 1, rowData); 
                    textFieldA.setText(null); 
                    textFieldB.setText(null); 
                } else { 
                    JOptionPane.showMessageDialog(container, 
                            "Your operation is forbidden", "Warning", 
                            JOptionPane.WARNING_MESSAGE); 
                } 
            } 
 
        }); 
        buttonDel.addActionListener(new ActionListener() { 
 
            @Override 
            public void actionPerformed(ActionEvent e) { 
                // TODO Auto-generated method stub  
                int[] selectedRows = table.getSelectedRows(); // table  
                                                                // 默認情況容許多行選擇  
                for (int i = 0; i < selectedRows.length; i++) { 
//                  System.out.println(selectedRows[i]);  
                    defaultTableModel.removeRow(selectedRows[i] – i); 
                } 
            } 
 
        }); 
        buttonDeselected.addActionListener(new ActionListener() { 
 
            @Override 
            public void actionPerformed(ActionEvent e) { 
                // TODO Auto-generated method stub  
                table.clearSelection(); 
            } 
 
        }); 
        scrollPane.addMouseListener(new MouseAdapter() { 
            @Override 
            public void mouseClicked(MouseEvent e) { 
//               System.out.println("here");  
                if (e.getClickCount() == 1 
                        && e.getButton() == MouseEvent.BUTTON1) { 
                    table.clearSelection(); 
                } 
            } 
        }); 
         
        // make the text field focused every time the window is activated  
        addWindowFocusListener(new WindowAdapter() { 
 
            @Override 
            public void windowGainedFocus(WindowEvent e) { 
                // TODO Auto-generated method stub  
                textFieldA.requestFocus();  
            } 
             
        }); 
 
        // **************************************************************  
        // This is a standard snippet to realize the desired column selection as in  
        // Excel  
        // **************************************************************  
 
        // row selection mode  
        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
        // column selection mode  
        TableColumnModel tableColumnModel = table.getColumnModel(); 
        tableColumnModel.getSelectionModel().setSelectionMode( 
                ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
        // allow the column selection (the row selection is allowed by default)  
        table.setColumnSelectionAllowed(true); 
        final JTableHeader tableHeader = table.getTableHeader(); 
        tableHeader.addMouseListener(new MouseAdapter() { 
            @Override 
            public void mouseClicked(MouseEvent e) { 
                // TODO Auto-generated method stub  
                // Extended modifiers represent the state of all modal keys,  
                // such as ALT, CTRL, META.  
                if (e.getClickCount() == 1 
                        && e.getButton() == MouseEvent.BUTTON1) { 
                    // Point point = new Point(e.getX(), e.getY());  
                    Point point = new Point(e.getPoint()); 
                    int columnNum = tableHeader.columnAtPoint(point); 
                    // System.out.println(columnNum);  
                    int[] selectedColumns = table.getSelectedColumns(); 
                    if (selectedColumns.length != 0) { 
                        // System.out.println("here1");  
                        // System.out.println(InputEvent.getModifiersExText(e.getModifiersEx()));  
                        if (e.getModifiersEx() == (InputEvent.CTRL_DOWN_MASK)) { 
//                          System.out.println("ctrl");  
                            if (Arrays.binarySearch(selectedColumns, columnNum) >= 0) { 
                                table.removeColumnSelectionInterval(columnNum, 
                                        columnNum); 
                            } else { 
                                table.addColumnSelectionInterval(columnNum, 
                                        columnNum); 
                            } 
                        } else if (e.getModifiersEx() == (InputEvent.SHIFT_DOWN_MASK)) { 
                            // System.out.println("shift");  
                            table.setColumnSelectionInterval( 
                                    selectedColumns[0], columnNum); 
                        } else { 
                            table.setColumnSelectionInterval(columnNum, 
                                    columnNum);       www.aiwalls.com
                        } 
                    } else { 
                        // System.out.println("here2");  
                        table.setColumnSelectionInterval(columnNum, columnNum); 
                    } 
                    table.setRowSelectionInterval(0, table.getRowCount() – 1); 
                } 
            } 
        }); 
         
        defaultTableModel.addTableModelListener(new TableModelListener() { 
 
            @Override 
            public void tableChanged(TableModelEvent e) { 
                // TODO Auto-generated method stub  
                int type = e.getType(); 
                int firstRow = e.getFirstRow(); 
//              int lastRow = e.getLastRow(); // the last row seems to be always equal to the first row  
                int column = e.getColumn(); 
                switch (type) { 
                case TableModelEvent.DELETE: 
                    System.out.print("此次事件由 刪除 行觸發:"); 
                    System.out.println("此次刪除的是第 " + firstRow + " 行"); 
                    break; 
                case TableModelEvent.INSERT: 
                    System.out.print("此次事件由 插入 行觸發:"); 
                    System.out.println("此次插入的是第 " + firstRow + " 行"); 
                    break; 
                case TableModelEvent.UPDATE: 
                    System.out.print("此次事件由 更新 行觸發:"); 
                    System.out.println("此次更新的是第 " + firstRow + " 行第 " + column + " 列"); 
                    break; 
                default: 
                    System.out.println("此次事件由 其他原因 觸發"); 
                } 
            } 
 
        }); 
    } 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub  
        TableModelEvent_1 frame = new TableModelEvent_1(); 
        frame.setTitle("表格模型事件示例"); 
        frame.pack(); //Realize the components.  
//      frame.setBounds(100, 100, 600, 300);  
//      textFieldA.requestFocus();  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true); //Display the window.  
    } 
 

作者:Gaowen_HAN
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *