JTable的学习

    技术2022-05-11  82

    1。写死数据的蠢办法

    ///            一个显示姓名,性别和出生年月的表格,点击表格某行的时候会有两种事件发生            ///

      package com.yinbodotcc.JTable;

    /*

    A网友说: repain()调用Component类的update()方法清除Component背景中以前的绘图,          然后update()在调用paint()。一般不要重载repaint(),有必要的话重载update()。

    B网友说: repaint()   ->   update()   ->   paint()             update()   一般都是有需要才被调用的。             通常应该重载   update()   和   paint()   而不是   repaint()。

    我说:    我就喜欢看大家说,然后记录下来,哈哈

     

    *///   这里需要学会JTable事件处理,        以及为了线程安全,需要从事件分派线程出发来显示界面

    import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import java.awt.Dimension;import java.awt.GridLayout;

    import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;

    import javax.swing.ListSelectionModel;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;

    public class SimpleTableDemo extends JPanel {    private boolean DEBUG = false; private boolean ALLOW_ROW_SELECTION = true; //个人感觉列可以选择,用处不是很大,掌握行可以选择,及单独的单元可以选中比较重要 private boolean ALLOW_COLUMN_SELECTION = false;

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

            //表格中数据填充  String[] columnNames = {"姓名","性别","出生年月","婚否"};        Object[][] data = {            {"杨安印", "男",             new Integer(19880206), new Boolean(false)},            {"吴义田", "男",             new Integer(19890206), new Boolean(true)}                          };        final JTable table = new JTable(data, columnNames);        table.setPreferredScrollableViewportSize(new Dimension(500, 70));

                ///        ///  //点击表格体的事件  if (DEBUG) {            table.addMouseListener(new MouseAdapter() {                public void mouseClicked(MouseEvent e) {                    printDebugData(table);                }            });        }  table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  //点击表格某行的事件  if(ALLOW_ROW_SELECTION){      ListSelectionModel lsm=table.getSelectionModel();   lsm.addListSelectionListener(new ListSelectionListener(){    public void valueChanged(ListSelectionEvent e)    {     //这一句若没有,则点击另外一行时候,将    "...被选中"打印两次     if (e.getValueIsAdjusting()) return;

         ListSelectionModel ls=(ListSelectionModel)e.getSource();     if(ls.isSelectionEmpty())     {      System.out.println("什么也没有选中");     }     else     {      int index=ls.getMinSelectionIndex();      System.out.println("行: "+index+" 被选中");     }    }   });

      }  else table.setRowSelectionAllowed(false);  //点击表格某列的事件  if(ALLOW_COLUMN_SELECTION)  {   if (ALLOW_ROW_SELECTION)   {                //可以选择单独的单元                table.setCellSelectionEnabled(true);            }            table.setColumnSelectionAllowed(true);            ListSelectionModel colSM =table.getColumnModel().getSelectionModel();            colSM.addListSelectionListener(new ListSelectionListener() {                public void valueChanged(ListSelectionEvent e) {                                       if (e.getValueIsAdjusting()) return;

                        ListSelectionModel lsm = (ListSelectionModel)e.getSource();                    if (lsm.isSelectionEmpty()) {                        System.out.println("没有列被选中");                    } else {                        int selectedCol = lsm.getMinSelectionIndex();                        System.out.println("列 " + selectedCol                                           + " 被选中");                    }                }            });

      }                    JScrollPane scrollPane = new JScrollPane(table);        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() {                JFrame frame = new JFrame("没有用DataModel的JTable例子");        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                    SimpleTableDemo newContentPane = new SimpleTableDemo();        newContentPane.setOpaque(true); //content panes must be opaque        frame.setContentPane(newContentPane);

                //调整此窗口的大小,以适合其子组件的首选大小和布局  frame.pack();        frame.setVisible(true);    }

        public static void main(String[] args) {               javax.swing.SwingUtilities.invokeLater(new Runnable() {            public void run() {                createAndShowGUI();            }        });    }}      

               缺点评价:A。所有行都能编辑,不一定好。B。要求是数组数据,但是如果数据是从数据库中获取,则不方便。C。所有数据都被作为String类型,非常不方便。所以我们需要更大的方便,请望下面看,我们会有进步的

     

    2。    让表格某一行不被选中(网友提供的做法)///

    class MyLSL implements ListSelectionListener {             private final int notSelectableRow;             public MyLSL( int notSelectableRow ) {                 this.notSelectableRow = notSelectableRow;             }             public void valueChanged( ListSelectionEvent e ) {                 if ( ! e.getValueIsAdjusting( ) && t.isRowSelected( notSelectableRow ) )                     t.removeRowSelectionInterval( notSelectableRow, notSelectableRow );             }         } 然后就可以: t.getSelectionModel( ).addListSelectionListener( new MyLSL( 1 ) ); 这里t是一个

     

    3.///                                                                     自己定义数据模型,然后传给视图import javax.swing.JFrame;import javax.swing.table.AbstractTableModel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import java.awt.Dimension;import java.awt.GridLayout;

    import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;

    import javax.swing.ListSelectionModel;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;看模型类:class MyTableModel extends AbstractTableModel{    //表格中数据填充 String[] columnNames = {"姓名","性别","出生年月","婚否"};    Object[][] data = {        {"杨安印", "男",         new Integer(19880206), new Boolean(false)},        {"吴义田", "男",         new Integer(19890206), new Boolean(true)}                      };    public int getRowCount()    {     return data.length;    }    public int getColumnCount()    {     return columnNames.length;    }    public Object getValueAt(int row, int column)    {     return data[row][column];    }    public Class<?> getColumnClass(int columnIndex)    {     return getValueAt(0, columnIndex).getClass();         }    public String getColumnName(int column)    {     return columnNames[column];    }    public void setValueAt(Object value, int row, int col) {//其实这个就包含了一定得事件处理性质        if (SimpleTableDemo.DEBUG) {            System.out.println("设置第 " + row + "行,第" + col                               + "列得值为 " + value                               + " 它得类是 "                               + value.getClass());        }

            data[row][col] = value;        fireTableCellUpdated(row, col);//还需要更新

            if (SimpleTableDemo.DEBUG) {            System.out.println("新得数据是:");            printDebugData();        }    }    public boolean isCellEditable(int rowIndex,int columnIndex)    {     if(columnIndex<1)      return false;     else return true;    }    private void printDebugData() {        int numRows = getRowCount();        int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {            System.out.print("    row " + i + ":");            for (int j=0; j < numCols; j++) {                System.out.print("  " + data[i][j]);            }            System.out.println();        }        System.out.println("--------------------------");    }}视图类:public class SimpleTableDemo extends JPanel {    public static final boolean DEBUG = true; private boolean ALLOW_ROW_SELECTION = true;     public SimpleTableDemo() {        super(new GridLayout(1,0));                MyTableModel m=new MyTableModel();        final JTable table = new JTable(m);        table.setPreferredScrollableViewportSize(new Dimension(500, 70));             ///  //点击表格体的事件  if (DEBUG) {            table.addMouseListener(new MouseAdapter() {                public void mouseClicked(MouseEvent e) {                    printDebugData(table);                }            });        }  table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  //点击表格某行的事件  if(ALLOW_ROW_SELECTION){      ListSelectionModel lsm=table.getSelectionModel();   lsm.addListSelectionListener(new ListSelectionListener(){    public void valueChanged(ListSelectionEvent e)    {     //这一句若没有,则点击另外一行时候,将    "...被选中"打印两次     if (e.getValueIsAdjusting()) return;

         ListSelectionModel ls=(ListSelectionModel)e.getSource();     if(ls.isSelectionEmpty())     {      System.out.println("什么也没有选中");     }     else     {      int index=ls.getMinSelectionIndex();      System.out.println("行: "+index+" 被选中");     }    }   });

      }  else table.setRowSelectionAllowed(false);                    JScrollPane scrollPane = new JScrollPane(table);        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() {                JFrame frame = new JFrame("没有用DataModel的JTable例子");        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                    SimpleTableDemo newContentPane = new SimpleTableDemo();        newContentPane.setOpaque(true); //content panes must be opaque        frame.setContentPane(newContentPane);

                //调整此窗口的大小,以适合其子组件的首选大小和布局  frame.pack();        frame.setVisible(true);    }

        public static void main(String[] args) {               javax.swing.SwingUtilities.invokeLater(new Runnable() {            public void run() {                createAndShowGUI();            }        });    }}

     

     

     


    最新回复(0)