JavaSwing_4.8:JTable(表)


このリンクは次のとおりです.http://blog.csdn.net/xietansheng/article/details/78079806
Java Swingグラフィックインタフェース開発(ディレクトリ)
1.概要
公式JavaDocsApi:javax.swing.JTableJTable、表.JTableは、通常の2 Dユニットテーブルを表示および編集するために使用されます.
2.簡単な表を作成する
package com.xiets.swing;

import javax.swing.*;
import java.awt.*;

public class Main {

    public static void main(String[] args) {
        JFrame jf = new JFrame("    ");
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //       ,      
        JPanel panel = new JPanel(new BorderLayout());

        //   (  )
        Object[] columnNames = {"  ", "  ", "  ", "  ", "  "};

        //        
        Object[][] rowData = {
                {"  ", 80, 80, 80, 240},
                {"John", 70, 80, 90, 240},
                {"Sue", 70, 70, 70, 210},
                {"Jane", 80, 70, 60, 210},
                {"Joe", 80, 70, 60, 210}
        };

        //       ,             
        JTable table = new JTable(rowData, columnNames);

        //             (              ,              )
        panel.add(table.getTableHeader(), BorderLayout.NORTH);
        //               
        panel.add(table, BorderLayout.CENTER);

        jf.setContentPane(panel);
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }

}

結果:
JavaSwing_4.8: JTable(表格)_第1张图片
表コンポーネントは、他の一般的なコンポーネントと同様に、中間コンテナに追加する必要があります.表をコンテナに追加するには、次の2つの方法があります.
  • は通常の中間コンテナに追加され(上記のコード例で示すようにJPanelに追加されます)、このとき追加されたjTableは表の行の内容にすぎず、ヘッダー(jTable.getTableHeader())は追加で追加する必要があります.この追加方式は表の行数の決定に適しており、データ量が小さく、一度に表示できる表である.
  • は、JScrollPaneスクロールコンテナに追加されます.この追加方法では、ヘッダを追加する必要はありません.jTablejScrollPaneに追加すると、ヘッダは自動的にスクロールコンテナの上部に追加され、行コンテンツのスクロールがサポートされます(行コンテンツをスクロールすると、ヘッダは常に上部に表示されます).

  • 3.JTableでよく使われる操作方法
    JTableの一般的な構造方法:
    //      ,         
    JTable() 
    
    //            ,            (A, B, C ...)    
    JTable(int numRows, int numColumns) 
    
    //     ,               
    JTable(Object[][] rowData, Object[] columnNames)
    
    //           
    JTable(TableModel dm)
    

    JTableフォントとグリッド色の設定:
    //       
    void setFont(Font font)
    
    //       
    void setForeground(Color fg)
    
    //          (         )
    void setSelectionForeground(Color selectionForeground)
    
    //          
    void setSelectionBackground(Color selectionBackground)
    
    //       
    void setGridColor(Color gridColor)
    
    //         
    void setShowGrid(boolean showGrid)
    
    //            
    void setShowHorizontalLines(boolean showHorizontalLines)
    
    //            
    void setShowVerticalLines(boolean showVerticalLines)
    

    JTableヘッダの設定:
    //     
    JTableHeader jTableHeader = jTable.getTableHeader();
    
    //           
    jTableHeader.setFont(Font font);
    
    //           
    jTableHeader.setForeground(Color fg);
    
    //                        。
    jTableHeader.setResizingAllowed(boolean resizingAllowed);
    
    //             ,       。
    jTableHeader.setReorderingAllowed(boolean reorderingAllowed);
    

    JTable行列に関する設定:
    //         
    void setRowHeight(int rowHeight)
    
    //         
    void setRowHeight(int row, int rowHeight)
    
    /**
     *             ,            ,   :
     *     JTable.AUTO_RESIZE_ALL_COLUMNS            ,         。
     *     JTable.AUTO_RESIZE_LAST_COLUMN            ,          。
     *     JTable.AUTO_RESIZE_NEXT_COLUMN   UI         ,              。
     *     JTable.AUTO_RESIZE_OFF          ;     。
     *     JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS   UI    ,             ;      。
     */
    void setAutoResizeMode(int mode)
    
    /*
     *     
     */
    //       
    TableColumn tableColumn = jTable.getColumnModel().getColumn(int columnIndex);
    
    //       、    、    、    
    tableColumn.setWidth(int width);
    tableColumn.setPreferredWidth(int preferredWidth);
    tableColumn.setMinWidth(int minWidth);
    tableColumn.setMaxWidth(int maxWidth);
    
    //        ,            。
    tableColumn.sizeWidthToFit();
    
    //              
    tableColumn.setResizable(boolean isResizable);
    
    //          
    tableColumn.setHeaderValue(Object headerValue);
    

    JTableデータ関連操作:
    /*
     *             
     */
    //              
    jTable.getModel().setValueAt(Object aValue, int rowIndex, int columnIndex);
    
    //              
    Object value = jTable.getModel().getValueAt(int rowIndex, int columnIndex);
    

    4.スクロールバー付きテーブルの作成
    スクロールバー付きテーブルを作成するには、次の手順に従います.
    //     
    JTable table = new JTable(...);
    
    /*          */
    
    //           (         ,           )
    table.setPreferredScrollableViewportSize(new Dimension(int width, int height));
    
    //       ,              (              )
    JScrollPane scrollPane = new JScrollPane(table);
    
    /*        scrollPane            */
    

    完全なインスタンスコード:
    package com.xiets.swing;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            JFrame jf = new JFrame("    ");
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //       
            JPanel panel = new JPanel();
    
            //   (  )
            String[] columnNames = {"  ", "  ", "  ", "  ", "  ", "  "};
    
            //        
            Object[][] rowData = {
                    {1, "  ", 80, 80, 80, 240},
                    {2, "John", 70, 80, 90, 240},
                    {3, "Sue", 70, 70, 70, 210},
                    {4, "Jane", 80, 70, 60, 210},
                    {5, "Joe_05", 80, 70, 60, 210},
                    {6, "Joe_06", 80, 70, 60, 210},
                    {7, "Joe_07", 80, 70, 60, 210},
                    {8, "Joe_08", 80, 70, 60, 210},
                    {9, "Joe_09", 80, 70, 60, 210},
                    {10, "Joe_10", 80, 70, 60, 210},
                    {11, "Joe_11", 80, 70, 60, 210},
                    {12, "Joe_12", 80, 70, 60, 210},
                    {13, "Joe_13", 80, 70, 60, 210},
                    {14, "Joe_14", 80, 70, 60, 210},
                    {15, "Joe_15", 80, 70, 60, 210},
                    {16, "Joe_16", 80, 70, 60, 210},
                    {17, "Joe_17", 80, 70, 60, 210},
                    {18, "Joe_18", 80, 70, 60, 210},
                    {19, "Joe_19", 80, 70, 60, 210},
                    {20, "Joe_20", 80, 70, 60, 210}
            };
    
            //       ,             
            JTable table = new JTable(rowData, columnNames);
    
            //         
            table.setForeground(Color.BLACK);                   //     
            table.setFont(new Font(null, Font.PLAIN, 14));      //     
            table.setSelectionForeground(Color.DARK_GRAY);      //        
            table.setSelectionBackground(Color.LIGHT_GRAY);     //        
            table.setGridColor(Color.GRAY);                     //     
    
            //     
            table.getTableHeader().setFont(new Font(null, Font.BOLD, 14));  //           
            table.getTableHeader().setForeground(Color.RED);                //           
            table.getTableHeader().setResizingAllowed(false);               //            
            table.getTableHeader().setReorderingAllowed(false);             //              
    
            //     
            table.setRowHeight(30);
    
            //         40
            table.getColumnModel().getColumn(0).setPreferredWidth(40);
    
            //           (         ,           )
            table.setPreferredScrollableViewportSize(new Dimension(400, 300));
    
            //               (              )
            JScrollPane scrollPane = new JScrollPane(table);
    
            //               
            panel.add(scrollPane);
    
            //             
            jf.setContentPane(panel);
    
            jf.pack();
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
        }
    
    }
    

    結果:
    JavaSwing_4.8: JTable(表格)_第2张图片
    5.テーブルモデル(Table Model)
    Table Modelインタフェースは、JTableがテーブル形式のデータモデルを問い合わせる方法を指定します.Table Modelはテーブル内の各種データをカプセル化し、テーブル表示にデータを提供する.上記の例では、行データとヘッダを直接使用してテーブルを作成していますが、実際にはJTable内部で自動的に入力された行データとヘッダがTable Modelにカプセル化されています.
    データ・モデルにTableModelインタフェースが実装されている限り、次の2行のコード設定JTableでモデルを表示できます.
    TableModel myData = new MyTableModel(); 
    JTable table = new JTable(myData);
    

    Table Modelインタフェースのメソッド:
    package javax.swing.table;
    
    import javax.swing.*;
    import javax.swing.event.*;
    
    public interface TableModel {
        /**       */
        public int getRowCount();
    
        /**       */
        public int getColumnCount();
    
        /**         (    ) */
        public String getColumnName(int columnIndex);
    
        /**            ,        。JTable                    。 */
        public Class<?> getColumnClass(int columnIndex);
    
        /**              */
        public boolean isCellEditable(int rowIndex, int columnIndex);
    
        /**           */
        public Object getValueAt(int rowIndex, int columnIndex);
    
        /**           */
        public void setValueAt(Object aValue, int rowIndex, int columnIndex);
    
        /**           */
        public void addTableModelListener(TableModelListener l);
    
        /**           */
        public void removeTableModelListener(TableModelListener l);
    }
    

    JREでよく使用される実装済みTableModelインタフェースのクラスは2つあります.
    (1)javax.swing.table.AbstractTableModel
    この抽象クラスは、Table Modelインタフェースのほとんどのメソッドにデフォルトの実装を提供します.リスナーを管理し、TableModelEventsを生成し、リスナーにスケジュールするのに便利です.AbstractTable Modelのサブクラスとして特定のTable Modelを作成するには、次の3つの方法を実装します.
    public int getRowCount();
    public int getColumnCount();
    public Object getValueAt(int row, int column);
    

    (2)javax.swing.table.DefaultTableModel
    これは、複数のVectorからなるセルの値オブジェクトを格納するためのVectorを使用するTable Modelの実装です.DefaultTable Modelでは、行列の追加や削除など、テーブルデータの操作を容易にする方法も多く追加されています.
    AbstractTable Modelを使用してテーブルを作成します.
    package com.xiets.swing;
    
    import javax.swing.*;
    import javax.swing.table.AbstractTableModel;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            JFrame jf = new JFrame("    ");
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //       ,      
            JPanel panel = new JPanel(new BorderLayout());
    
            //             
            JTable table = new JTable(new MyTableModel());
    
            //             (              ,              )
            panel.add(table.getTableHeader(), BorderLayout.NORTH);
            //               
            panel.add(table, BorderLayout.CENTER);
    
            jf.setContentPane(panel);
            jf.pack();
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
        }
    
        /**
         *       ,                               
         */
        public static class MyTableModel extends AbstractTableModel {
            /**
             *   (  )
             */
            private Object[] columnNames = {"  ", "  ", "  ", "  ", "  "};
    
            /**
             *        
             */
            private Object[][] rowData = {
                    {"  ", 80, 80, 80, 240},
                    {"John", 70, 80, 90, 240},
                    {"Sue", 70, 70, 70, 210},
                    {"Jane", 80, 70, 60, 210},
                    {"Joe", 80, 70, 60, 210}
            };
    
            /**
             *      
             */
            @Override
            public int getRowCount() {
                return rowData.length;
            }
    
            /**
             *      
             */
            @Override
            public int getColumnCount() {
                return columnNames.length;
            }
    
            /**
             *      (    ),AbstractTableModel             
             *      A         ,                    。
             */
            @Override
            public String getColumnName(int column) {
                return columnNames[column].toString();
            }
    
            /**
             *             
             */
            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return rowData[rowIndex][columnIndex];
            }
        }
    
    }
    

    結果:
    JavaSwing_4.8: JTable(表格)_第3张图片
    対応するセルをマウスでクリックすると、AbstractTable ModelでisCellEditable(...)メソッドの実装はfalse、すなわちセルが編集できないため、セルが編集できないことがわかります.一部のセルが編集をサポートする必要がある場合は、isCellEditable(...)メソッドを書き換えて、対応するセルに対してtrueを返すことができます.
    6.テーブルデータ変更の傍受(TableModelListener)
    テーブルのデータメンテナンス、データのリスニングは、すべてテーブルモデル(Table Model)によってメンテナンスされ、テーブルモデルリスナー(Table ModelListener)を設定することで、テーブルセルデータの変更、テーブル列の増加、削除をリスニングできます.
    テーブルモデルリスナーのプライマリコードを設定します.
    //            
    TableModel tableModel = table.getModel();
    
    //                   
    tableModel.addTableModelListener(new TableModelListener() {
        @Override
        public void tableChanged(TableModelEvent e) {
            //                 (      ,     )
            int firstRow = e.getFirstRow();
            int lastRow = e.getLastRow();
    
            //      
            int column = e.getColumn();
    
            //      ,     :
            //     TableModelEvent.INSERT           
            //     TableModelEvent.UPDATE          
            //     TableModelEvent.DELETE          
            int type = e.getType();
        }
    });
    

    コードの例:
    package com.xiets.swing;
    
    import javax.swing.*;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableModel;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            JFrame jf = new JFrame("    ");
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //       ,      
            JPanel panel = new JPanel(new BorderLayout());
    
            //   (  )
            final Object[] columnNames = {"  ", "  ", "  ", "  ", "  "};
    
            //        
            final Object[][] rowData = {
                    {"  ", 80, 80, 80, 240},
                    {"John", 70, 80, 90, 240},
                    {"Sue", 70, 70, 70, 210},
                    {"Jane", 80, 70, 60, 210},
                    {"Joe", 80, 70, 60, 210}
            };
    
            //        ,      
            JTable table = new JTable(new AbstractTableModel() {
                @Override
                public int getRowCount() {
                    return rowData.length;
                }
    
                @Override
                public int getColumnCount() {
                    return rowData[0].length;
                }
    
                @Override
                public String getColumnName(int column) {
                    return columnNames[column].toString();
                }
    
                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    //         4,        ,       ,
                    //           、  、            ,     
                    return columnIndex != 4;
                }
    
                @Override
                public Object getValueAt(int rowIndex, int columnIndex) {
                    return rowData[rowIndex][columnIndex];
                }
    
                @Override
                public void setValueAt(Object newValue, int rowIndex, int columnIndex) {
                    //           ,              ,
                    //    UI     getValueAt(...)                
                    rowData[rowIndex][columnIndex] = newValue;
                    //       ,         UI(     ),           
                    fireTableCellUpdated(rowIndex, columnIndex);
                }
            });
    
            /*
             *       AbstractTableModel          ,      ,        
             *    (      ,  UI  ,      ),     DefaultTableModel  ,
             *     TableModel          ,          ,  UI    ,   
             *   ,  /     。            ,      ,        :
             */
            // DefaultTableModel tableModel = new DefaultTableModel(rowData, columnNames);
            // JTable table = new JTable(tableModel);
    
            //        
            final TableModel tableModel = table.getModel();
            //                   
            tableModel.addTableModelListener(new TableModelListener() {
                @Override
                public void tableChanged(TableModelEvent e) {
                    //                    (      ,     )
                    int firstRow = e.getFirstRow();
                    int lastRow = e.getLastRow();
    
                    //        
                    int column = e.getColumn();
    
                    //      ,     :
                    //     TableModelEvent.INSERT           
                    //     TableModelEvent.UPDATE          
                    //     TableModelEvent.DELETE          
                    int type = e.getType();
    
                    //                     
                    if (type == TableModelEvent.UPDATE) {
                        //       、  、      (     1、2、3)      
                        if (column < 1 || column > 3) {
                            return;
                        }
                        //          ,                
                        for (int row = firstRow; row <= lastRow; row++) {
                            //          、  、     
                            Object chineseObj = tableModel.getValueAt(row, 1);
                            Object mathObj = tableModel.getValueAt(row, 2);
                            Object englishObj = tableModel.getValueAt(row, 3);
    
                            //          
                            int chinese = 0;
                            try {
                                chinese = Integer.parseInt("" + chineseObj);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                            int math = 0;
                            try {
                                math = Integer.parseInt("" + mathObj);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                            int english = 0;
                            try {
                                english = Integer.parseInt("" + englishObj);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
    
                            //          
                            int totalScore = chinese + math + english;
                            //               (        4)
                            tableModel.setValueAt(totalScore, row, 4);
                        }
                    }
                }
            });
    
            //             (              ,              )
            panel.add(table.getTableHeader(), BorderLayout.NORTH);
            //               
            panel.add(table, BorderLayout.CENTER);
    
            jf.setContentPane(panel);
            jf.pack();
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
        }
    
    }
    

    結果は、単科点数を修正し、車に戻って、総点数の変化を見ることを示した.
    JavaSwing_4.8: JTable(表格)_第4张图片
    7.表セレクタ(ListSelectionModel)
    表データの選択はListSelectionModelセレクタモデルを使用して維持され、ユーザーが異なるモードで表のデータを選択できるようにします.
    ListSelectionModelの使用:
    //     
    final JTable table = new JTable(...);
    
    //              ,    false
    table.setCellSelectionEnabled(boolean cellSelectionEnabled);
    
    //          table        
    ListSelectionModel selectionModel = table.getSelectionModel();
    
    //        ,       :
    //     ListSelectionModel.MULTIPLE_INTERVAL_SELECTION                   (  )
    //     ListSelectionModel.SINGLE_INTERVAL_SELECTION                  
    //     ListSelectionModel.SINGLE_SELECTION                          
    selectionModel.setSelectionMode(int selectionMode);
    
    //          (         )
    selectionModel.addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            //         
            int selectedRow = table.getSelectedRow();
            
            //         
            int selectedRow = table.getSelectedColumn();        
            
            //         
            int[] selectedRows = table.getSelectedRows();
            
            //         
            int[] selectedColumns = table.getSelectedColumns();
        }
    });
    

    8.セルのレンダラー(Table CellRenderer)
    セルレンダラーは、各セルの表示スタイルを指定します.
    次のコードインスタンスでは、テーブルの偶数行の背景を白に、奇数行の背景をグレーに、最初の列の内容を水平に中央に、最後の列の内容を水平に右に、他の列の内容を水平に左に揃えます.
    package com.xiets.swing;
    
    import javax.swing.*;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableColumn;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            JFrame jf = new JFrame("    ");
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //       ,      
            JPanel panel = new JPanel(new BorderLayout());
    
            //   (  )
            Object[] columnNames = {"  ", "  ", "  ", "  ", "  "};
    
            //        
            Object[][] rowData = {
                    {"  ", 80, 80, 80, 240},
                    {"John", 70, 80, 90, 240},
                    {"Sue", 70, 70, 70, 210},
                    {"Jane", 80, 70, 60, 210},
                    {"Joe_01", 80, 70, 60, 210},
                    {"Joe_02", 80, 70, 60, 210},
                    {"Joe_03", 80, 70, 60, 210},
                    {"Joe_04", 80, 70, 60, 210},
                    {"Joe_05", 80, 70, 60, 210}
            };
    
            //       ,             
            JTable table = new JTable(rowData, columnNames);
    
            //         
            MyTableCellRenderer renderer = new MyTableCellRenderer();
    
            //         ,              
            for (int i = 0; i < columnNames.length; i++) {
                //             
                TableColumn tableColumn = table.getColumn(columnNames[i]);
                //                
                tableColumn.setCellRenderer(renderer);
            }
    
            //            ,                
            // table.getTableHeader().setDefaultRenderer(headerRenderer);
    
            //             (              ,              )
            panel.add(table.getTableHeader(), BorderLayout.NORTH);
            //               
            panel.add(table, BorderLayout.CENTER);
    
            jf.setContentPane(panel);
            jf.pack();
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
        }
    
        /**
         *       ,                 DefaultTableCellRenderer
         */
        public static class MyTableCellRenderer extends DefaultTableCellRenderer {
            /**
             *             ,          ,          ,              
             */
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                //           ,          
                if (row % 2 == 0) {
                    setBackground(Color.WHITE);
                } else {
                    setBackground(Color.LIGHT_GRAY);
                }
    
                //             ,            ,           
                if (column == 0) {
                    setHorizontalAlignment(SwingConstants.CENTER);
                } else if (column == (table.getColumnCount() - 1)) {
                    setHorizontalAlignment(SwingConstants.RIGHT);
                } else {
                    setHorizontalAlignment(SwingConstants.LEFT);
                }
                
                //       ,        (row, column)             
                setToolTipText("     : " + row + ", " + column);
    
                // PS:              ,        ,       ,             。
    
                /*
                 *                    ,           DefaultTableCellRenderer    
                 *          JLabel,   JLabel      API               。
                 *
                 * super.getTableCellRendererComponent(...)            (this),  JLabel   ,
                 *      JLabel         。
                 *
                 *                (       、   、     ),              
                 *     。
                 */
    
                //                   
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        }
    
    }
    

    結果:
    JavaSwing_4.8: JTable(表格)_第5张图片
    9.セルデータのエディタ(Table CellEditor)
    レンダラーは、セルのデータを通常表示するときに表示コンポーネントを提供し、エディタはセルのデータを編集するときに表示(使用)するコンポーネントです.
    エディタを使用して、セルに入力されたコンテンツのフォーマットを制御したり、入力されたコンテンツの変化を傍受したりすることができます.
    よく使われる編集コンポーネントはJTextField(テキストボックス)で、編集コンポーネントとしてJCheckBox(オプションボックス)、JComboBox(テキストボックス)などのコンポーネントを使用することもできます.
    エディタインタフェースはTableCellEditorで、指定したセルに編集コンポーネントを提供する方法は1つしかありません.インタフェースが実装されたデフォルトエディタDefaultCellEditorは、通常、実際に使用される.
    次のコードでは、DefaultCellEditorをベースクラスとして使用して、数値しか入力できないエディタをカスタマイズします.
    package com.xiets.swing;
    
    import javax.swing.*;
    import javax.swing.table.TableColumn;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            JFrame jf = new JFrame("    ");
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //       ,      
            JPanel panel = new JPanel(new BorderLayout());
    
            //   (  )
            Object[] columnNames = {"  ", "  ", "  ", "  ", "  "};
    
            //        
            Object[][] rowData = {
                    {"  ", 80, 80, 80, 240},
                    {"John", 70, 80, 90, 240},
                    {"Sue", 70, 70, 70, 210},
                    {"Jane", 80, 70, 60, 210},
                    {"Joe", 80, 70, 60, 210}
            };
    
            //       ,             
            JTable table = new JTable(rowData, columnNames);
    
            //         ,           
            MyCellEditor cellEditor = new MyCellEditor(new JTextField());
    
            //           ,           
            for (int i = 1; i < columnNames.length; i++) {
                //             
                TableColumn tableColumn = table.getColumn(columnNames[i]);
                //                
                tableColumn.setCellEditor(cellEditor);
            }
    
            //             (              ,              )
            panel.add(table.getTableHeader(), BorderLayout.NORTH);
            //               
            panel.add(table, BorderLayout.CENTER);
    
            jf.setContentPane(panel);
            jf.pack();
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
        }
    
        /**
         *               
         */
        public static class MyCellEditor extends DefaultCellEditor {
    
            public MyCellEditor(JTextField textField) {
                super(textField);
            }
    
            public MyCellEditor(JCheckBox checkBox) {
                super(checkBox);
            }
    
            public MyCellEditor(JComboBox comboBox) {
                super(comboBox);
            }
    
            @Override
            public boolean stopCellEditing() {
                //              
                Component comp = getComponent();
    
                //               
                Object obj = getCellEditorValue();
    
                //                   ,    false(      ,     ,    )
                if (obj == null || !obj.toString().matches("[0-9]*")) {
                    //      ,                
                    comp.setForeground(Color.RED);
                    return false;
                }
    
                //      ,                
                comp.setForeground(Color.BLACK);
    
                //           
                return super.stopCellEditing();
            }
        }
    
    }
    

    結果:
    JavaSwing_4.8: JTable(表格)_第6张图片
    10.テーブルデータのソート(RowSorter)
    JTableはまた、ヘッダーをクリックして列を昇順または降順にソートすることをサポートし、テーブルにテーブル行ソート器TableRowSorter(辞書順にソート)を設定するだけです.
    コードの例:
    package com.xiets.swing;
    
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    import javax.swing.table.TableRowSorter;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            JFrame jf = new JFrame("    ");
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //       ,      
            JPanel panel = new JPanel(new BorderLayout());
    
            //   (  )
            Object[] columnNames = {"  ", "  ", "  ", "  ", "  "};
    
            //        
            Object[][] rowData = {
                    {"  ", 80, 80, 80, 240},
                    {"John", 70, 80, 90, 240},
                    {"Sue", 70, 70, 70, 210},
                    {"Jane", 80, 70, 60, 210},
                    {"Joe", 80, 70, 60, 210}
            };
    
            //        ,             
            TableModel tableModel = new DefaultTableModel(rowData, columnNames);
    
            //              
            JTable table = new JTable(tableModel);
    
            //                (TableRowSorter     RowSorter)
            RowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(tableModel);
    
            //             
            table.setRowSorter(rowSorter);
    
            //             (              ,              )
            panel.add(table.getTableHeader(), BorderLayout.NORTH);
            //               
            panel.add(table, BorderLayout.CENTER);
    
            jf.setContentPane(panel);
            jf.pack();
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
        }
    
    }
    

    結果:
    JavaSwing_4.8: JTable(表格)_第7张图片