那位大侠知道怎样能让jtable在水平滚动时最左变得两列不滚动,而其他列滚动呢?Excel里就有这样的功能

解决方案 »

  1.   

    你可以创建2个JT来显示数据,一个表显示不可滚动的数据,一个显示滚动的数据.下面是SUN的例子import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.event.*;public class FixedColumnExample extends JFrame {
        
        Object[][] data;
        Object[] column;
        JTable fixedTable,table;
        
        public FixedColumnExample() {
            
            super( "Fixed Column Example" );
            
            setSize( 400, 150 );
            
            data =  new Object[][]{
                {"1","11","A","","","","",""},
                {"2","22","","B","","","",""},
                {"3","33","","","C","","",""},
                {"4","44","","","","D","",""},
                {"5","55","","","","","E",""},
                {"6","66","","","","","","F"}};
                column = new Object[]{"fixed 1","fixed 2","a","b","c","d","e","f"};
                
                AbstractTableModel fixedModel = new AbstractTableModel() {
                    // We have two fixed rows so report 2 columns from data
                    public int getColumnCount() { return 2; }
                    public int getRowCount() { return data.length; }
                    public String getColumnName(int col) { return (String)column[col]; }
                    // As only the first two columns are reported this can stay
                    // the same
                    public Object getValueAt(int row, int col) { return data[row][col]; }
                };
                
                AbstractTableModel    model = new AbstractTableModel() {
                    // This model has two less columns in the data as two are
                    // fixed
                    public int getColumnCount() { return column.length -2; }
                    public int getRowCount() { return data.length; }
                    public String getColumnName(int col) {
                        // The columns start 2 on in the data
                        return (String)column[col +2];
                    }
                    public Object getValueAt(int row, int col) {
                        // The first two column are for the fixed table so return
                        // data after by adding 2
                        return data[row][col+2];
                    }
                    public void setValueAt(Object obj, int row, int col) {
                        // As above
                        data[row][col +2] = obj;
                    }
                    public boolean isCellEditable(int row, int col) { return true; }
                };
                
                fixedTable = new JTable( fixedModel ) ;
                ListSelectionModel lsm = fixedTable.getSelectionModel();
                fixedTable.getTableHeader().setResizingAllowed(false);
                lsm.addListSelectionListener(new SelectionListener(true));
                
                table = new JTable( model ) ;
                lsm = table.getSelectionModel();
                lsm.addListSelectionListener(new SelectionListener(false));
                fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                
                JScrollPane scroll = new JScrollPane( table );
                JViewport viewport = new JViewport();
                viewport.setView(fixedTable);
                viewport.setPreferredSize(fixedTable.getPreferredSize());
                scroll.setRowHeaderView(viewport);
                scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER,fixedTable.getTableHeader());
                
                getContentPane().add(scroll, BorderLayout.CENTER);
        }
        
        class SelectionListener implements ListSelectionListener {
            
            boolean isFixedTable = true;
            
            public SelectionListener(boolean isFixedTable) { this.isFixedTable = isFixedTable; }
            
            public void valueChanged(ListSelectionEvent e) {
                
                if (isFixedTable)  {
                    int fixedSelectedIndex = fixedTable.getSelectedRow();
                    table.setRowSelectionInterval(fixedSelectedIndex,fixedSelectedIndex);
                }
                else {
                    int selectedIndex = table.getSelectedRow();
                    fixedTable.setRowSelectionInterval(selectedIndex,selectedIndex);
                }
            }
        }
        
        public static void main(String[] args) {
            FixedColumnExample frame = new FixedColumnExample();
            frame.addWindowListener( new WindowAdapter() {
                public void windowClosing( WindowEvent e ) {
                    System.exit(0);
                }
            });
            frame.setVisible(true);
        }
    }
      

  2.   

    同意楼上的
    要是想用一个JTable的话,那就要改JViewPort的刷新,要写N多代码...