如题,效果和excel中的固定行(列),好象也叫冻结功能一样
比如要求前两列不随水平滚动条移动,始终显示在初始位置,水平滚动条托动时,
从第3列开始可以滚动行也要求一样的效果谁知道请给出关键代码,即刻结贴

解决方案 »

  1.   

    问题已经解决了,找了点资料,是用两个table做的
    大家还有什么不同见解吗,一起来讨论讨论吧,
    100分就这么给系统了有点太浪费了啊
      

  2.   

    我把代码贴出来给大家共享一下吧,也许有谁用得着的
    只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
    原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了
    附代码,jdk1.6下通过public class TestFixTable extends JFrame {
        private static final long serialVersionUID = 1L;    Object[][] data;    Object[] column;    JTable fixedTable, table;    public TestFixTable() {
            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", "o", "a", "b", "c", "d", "e", "f" };        AbstractTableModel fixedModel = new AbstractTableModel() {
                private static final long serialVersionUID = 1L;            public int getColumnCount() {
                    return 1;
                }            public int getRowCount() {
                    return data.length;
                }            public String getColumnName(int col) {
                    return (String) column[col];
                }            public Object getValueAt(int row, int col) {
                    return data[row][col];
                }
            };
            AbstractTableModel model = new AbstractTableModel() {
                private static final long serialVersionUID = 1L;            public int getColumnCount() {
                    return column.length - 2;
                }            public int getRowCount() {
                    return data.length;
                }            public String getColumnName(int col) {
                    return (String) column[col + 1];
                }            public Object getValueAt(int row, int col) {
                    return data[row][col + 1];
                }            public void setValueAt(Object obj, int row, int col) {
                    data[row][col + 1] = obj;
                }            public boolean CellEditable(int row, int col) {
                    return true;
                }
            };        fixedTable = new JTable(fixedModel);
            fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            fixedTable.getSelectionModel().addListSelectionListener(
                    new ListSelectionListener() {
                        public void valueChanged(ListSelectionEvent arg0) {
                            checkSelection(true);                    }
                    });        table = new JTable(model);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.getSelectionModel().addListSelectionListener(
                    new ListSelectionListener() {
                        public void valueChanged(ListSelectionEvent arg0) {
                            checkSelection(false);
                        }
                    });        JViewport viewport = new JViewport();
            viewport.setView(fixedTable);
            viewport.setPreferredSize(fixedTable.getPreferredSize());        JScrollPane scroll = new JScrollPane(table);
            scroll.setRowHeaderView(viewport);
            scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
                    .getTableHeader());        getContentPane().add(scroll, BorderLayout.CENTER);
        }    private void checkSelection(boolean isFixedTable) {
            int fixedSelectedIndex = fixedTable.getSelectedRow();
            int selectedIndex = table.getSelectedRow();
            if (fixedSelectedIndex != selectedIndex) {
                if (isFixedTable) {
                    table.setRowSelectionInterval(fixedSelectedIndex,
                            fixedSelectedIndex);
                } else {
                    fixedTable
                            .setRowSelectionInterval(selectedIndex, selectedIndex);
                }
            }    }    public static void main(String[] args) {
            TestFixTable frame = new TestFixTable();
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            frame.setVisible(true);
        }
    }
      

  3.   

    终于有人肯捧场了,感动ing....大家互相学习,交流一下!
      

  4.   

    固定列是行表头的思想,即将所有行的前几列固定,比较好的做法是采用两个表,与楼主列的资料类似。
        
    public static JScrollPane createAJScrollPane(JTable sideTb,int sideViewWidth,JTable Tb){
       JScrollPane result = new JScrollPane(Tb);   JViewport dataviewport = new JViewport();   result.getViewport().setBackground(Color.white);
       result.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);   //添加左边表格
       dataviewport.setView(sideTb);
       dataviewport.setBackground(Color.white);
       dataviewport.setPreferredSize(new Dimension(sideViewWidth, 100));
       result.setRowHeader(dataviewport);
       result.setCorner(JScrollPane.UPPER_LEFT_CORNER, sideTb.getTableHeader());   return result;
    }
    固定行是多表头的思想,网上比较多的资料是重写UI的思想,可以搜索GroupableTableHeaderUI,但这种做法存在很多问题,例如导出,或多表头个别数据的修改。前两天看到了利用layout实现的方式,可以看看:http://topic.csdn.net/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html
      

  5.   

    ....我要固定行和列......我只能固定行:table.setRowHeight(20);,列我固定不了,求助SOS