请问JTABLE如何做到固定行?固定列已经做出来了,但是固定行无论怎样set都做不出来啊。
由于本人的分不多,只能给30分了,但请各位大侠帮忙啊!

解决方案 »

  1.   

    不是啊,像EXCEL那样冻结行啊,我已经做出冻结列了,但是行无法冻结
      

  2.   

    你所谓的固定行是指什么?如果是行数,那么是由model决定的,如果是这一行不可编辑,那么也是由model决定的。
      

  3.   

    像EXCEL冻结行那样,SCROLLBar滚动的时候,这个冻结的行不滚动。像合计行的效果那样,合计行上边的行滚动,但是合计行固定在那不动啊
      

  4.   

    你这样的话恐怕一个表格难以实现,因为JTable是放到JScrollPane中的,滚动是由JScrollPane控制的,要么你要改写ScrollPane,要么用多个表格实现。
      

  5.   

    很简单...
    重载model中的getValueAt方法即可~
    一般情况下返回正常数值
    在固定行位置,返回自定义数值即可....
      

  6.   

    终于做出来了,是参考http://crionics.com/products/opensource/faq/swing_ex/JTableExamples3.html这个例子作出来的。
      

  7.   

    这个是我写冻结行与冻结列的例子。谁有更好的,请指点指点。程序有点乱。import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Point;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import javax.swing.JScrollBar;
    import javax.swing.JScrollPane;
    import javax.swing.JViewport;
    import javax.swing.ListSelectionModel;
    import java.awt.Rectangle;
    import javax.swing.JTable;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.TableColumnModelEvent;
    import javax.swing.event.TableColumnModelListener;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.JTableHeader;
    import java.awt.Dimension;
    import java.awt.event.AdjustmentEvent;
    import java.awt.event.AdjustmentListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    public class table_try extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JScrollPane jScrollPane = null;
    private JTable jTable = null;
    private JTable fix_Ctable = null;  //  @jve:decl-index=0:visual-constraint="366,45" private JTable fix_Rtable = null;  //  @jve:decl-index=0:visual-constraint="365,106"
        String head1[]={"A","B","C","D","E"};  //  @jve:decl-index=0:
        String head[]={"行号"};
        int rows=15;
        DefaultTableModel dtm=null,fix_dtm1=null,fix_dtm2=null,fix_dtm3=null; private JScrollPane jScrollPane1 = null;  //  @jve:decl-index=0:visual-constraint="377,158" private JTable fix_Ctable1 = null;  //  @jve:decl-index=0:visual-constraint="371,194"
    /**
     * This is the default constructor
     */
    public table_try() {
    super();
    initialize();
    } /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
    this.setSize(300, 200);
    this.setContentPane(getJContentPane());
    this.setTitle("JFrame");
    } /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */

      

  8.   

    private JPanel getJContentPane() {
    if (jContentPane == null) {
    jContentPane = new JPanel();
    //冻结行的关键1
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
    jContentPane.add(getJScrollPane1(), BorderLayout.SOUTH);
    }
    return jContentPane;
    } /**
     * This method initializes jScrollPane
     * 
     * @return javax.swing.JScrollPane
     */
    ///jScrollPane添加fix_Ctable与jTable
    private JScrollPane getJScrollPane() {
    if (jScrollPane == null) {
    jScrollPane = new JScrollPane();
    jScrollPane.setPreferredSize(new Dimension(400, 100));
                //冻结列的关键
    jScrollPane.setViewportView(getJTable());
    JViewport viewport=new JViewport();
    viewport.setView(getFix_Ctable());
    viewport.setPreferredSize(fix_Ctable.getPreferredSize());
    jScrollPane.setRowHeader(viewport);
    jScrollPane.setCorner(JScrollPane.UPPER_LEADING_CORNER,fix_Ctable.getTableHeader());
    //冻结行的关键2
    jScrollPane.setPreferredSize(new Dimension(400, 52));  // Hmm...
    jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
       //jScrollPane滚动时,jScrollPane1的滚动条滚动
    JScrollBar bar1 = jScrollPane.getHorizontalScrollBar();
      bar1.addAdjustmentListener(new AdjustmentListener() {
        public void adjustmentValueChanged(AdjustmentEvent e) {
           JScrollBar bar2 =jScrollPane1.getHorizontalScrollBar();
          bar2.setValue(e.getValue());
        }
      });
    }
    return jScrollPane;
    }
    /**
     * This method initializes jScrollPane1
     * 
     * @return javax.swing.JScrollPane
     */
    //jScrollPane1添加fix_Ctable1与fix_Rtable
    private JScrollPane getJScrollPane1() {
    if (jScrollPane1 == null) {
    //行冻结的关键3
    jScrollPane1 = new JScrollPane(getFix_Rtable()){
      public void setColumnHeaderView(Component view) {} // work around
    };
    //列冻结关键
    JViewport viewport=new JViewport();
    viewport.setView(getFix_Ctable1());
    viewport.setPreferredSize(fix_Ctable1.getPreferredSize());
    jScrollPane1.setRowHeader(viewport);
    jScrollPane1.setCorner(JScrollPane.UPPER_LEADING_CORNER,fix_Ctable1.getTableHeader());
                //冻结行的关键4
    jScrollPane1.setPreferredSize(new Dimension(400, 35)); 
    jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
     //jScrollPane1滚动时,jScrollPane的滚动条滚动
        JScrollBar bar2 =jScrollPane1.getHorizontalScrollBar();
      bar2.addAdjustmentListener(new AdjustmentListener() {
        public void adjustmentValueChanged(AdjustmentEvent e) {
         JScrollBar bar1 = jScrollPane.getHorizontalScrollBar();
            bar1.setValue(e.getValue());
        }
      }); }
    return jScrollPane1;
    }
    /**
     * This method initializes jTable
     * 
     * @return javax.swing.JTable
     */
    //jTable
    private JTable getJTable() {
    if (jTable == null) {
    String data[][]=new String[rows][head1.length];
    dtm=new DefaultTableModel(data,head1);
    jTable = new JTable(dtm);
    jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jTable.getSelectionModel().addListSelectionListener(
    new ListSelectionListener(){
    public void valueChanged(ListSelectionEvent e) {
    checkSelection(false);//列同步
    checkSelection1(false);//行同步
    // TODO Auto-generated method stub

    }
    });
    //响应列宽事件,当jTable的列宽发生改变的时候,fix_Rtable的列宽也发生改变
    jTable.getColumnModel().addColumnModelListener( new   TableColumnModelListener()
      { public void columnAdded(TableColumnModelEvent e) {
    // TODO Auto-generated method stub

    }
                         
    public void columnMarginChanged(ChangeEvent e) {
    int jtwidth=0,fixwidth=0,i=0;
    while(i<jTable.getColumnCount()){
          jtwidth=jTable.getColumn(jTable.getColumnName(i)).getWidth();
          fixwidth=fix_Rtable.getColumn(fix_Rtable.getColumnName(i)).getWidth();
          if(jtwidth!=fixwidth){
              fix_Rtable.getColumn(fix_Rtable.getColumnName(i)).setPreferredWidth(jtwidth);
              break;
          }
    i++;
    }
    // TODO Auto-generated method stub

    } public void columnMoved(TableColumnModelEvent e) {
    // TODO Auto-generated method stub

    } public void columnRemoved(TableColumnModelEvent e) {
    // TODO Auto-generated method stub

    } public void columnSelectionChanged(ListSelectionEvent e) {
    // TODO Auto-generated method stub

    }   
     
      });
    }
    return jTable;
    } /**
     * This method initializes fix_Ctable
     * 
     * @return javax.swing.JTable
     */
    //jTable的冻结列fix_Ctable()
    private JTable getFix_Ctable() {
    if (fix_Ctable == null) {
    String data[][]=new String[rows][1];
    fix_dtm1=new DefaultTableModel(data,head);
    fix_Ctable = new JTable(fix_dtm1);
    fix_Ctable.getColumn("行号").setPreferredWidth(38);
    fix_Ctable.setSize(new Dimension(174, 45));
    fix_Ctable.getSelectionModel().addListSelectionListener(
    new ListSelectionListener(){
    public void valueChanged(ListSelectionEvent e) {
    checkSelection1(true);
    // TODO Auto-generated method stub

    }
    });
    }
    return fix_Ctable;
    } /**
     * This method initializes fix_Rtable
     * 
     * @return javax.swing.JTable
     */
    //jTable的冻结行fix_Rtable
    private JTable getFix_Rtable() {
    if (fix_Rtable == null) {
    String data[][]=new String[1][1];
    fix_dtm2=new DefaultTableModel(data,head1);
    fix_Rtable = new JTable(fix_dtm2);
    fix_Rtable.setSize(new Dimension(191, 44));
    fix_Rtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    fix_Rtable.getSelectionModel().addListSelectionListener(
    new ListSelectionListener(){
    public void valueChanged(ListSelectionEvent e) {
    checkSelection(true);
    // TODO Auto-generated method stub

    }
    });
    fix_Rtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }
    return fix_Rtable;
    }

    /**
     * This method initializes fix_Ctable1
     * 
     * @return javax.swing.JTable
     */
    //fix_Rtable的冻结列
    private JTable getFix_Ctable1() {
    if (fix_Ctable1 == null) {
    String data[][]=new String[1][1];
    fix_dtm3=new DefaultTableModel(data,head);
    fix_Ctable1 = new JTable(fix_dtm3);
    fix_Ctable1 .getColumn("行号").setPreferredWidth(38);
    fix_Ctable1.setSize(new Dimension(143, 25));
    }
    return fix_Ctable1;
    }  
    //jTable的行与fix_Ctable的行同步
      private void checkSelection1(boolean isFixedTable) {
            int fixedSelectedIndex = fix_Ctable.getSelectedRow();
            int selectedIndex = jTable.getSelectedRow();
            if(fixedSelectedIndex==-1)
             fixedSelectedIndex=0;
            if(selectedIndex==-1)
             selectedIndex=0;
            if (fixedSelectedIndex != selectedIndex) {
                if (isFixedTable) {
                 jTable.setRowSelectionInterval(fixedSelectedIndex,
                            fixedSelectedIndex);
                } else {
                 fix_Ctable
                            .setRowSelectionInterval(selectedIndex, selectedIndex);
                }
            }
        }
      //jTable的列与fix_Rtable同步
    private void checkSelection(boolean isFixRtable) {
     int fixedSelectedIndex =fix_Rtable.getSelectedColumn();
            int selectedIndex = jTable.getSelectedColumn();
              if(fixedSelectedIndex==-1)
             fixedSelectedIndex=0;
            if(selectedIndex==-1)
             selectedIndex=0;
            if (fixedSelectedIndex != selectedIndex) {
                if (isFixRtable) {
                 jTable.setColumnSelectionInterval(fixedSelectedIndex,
                            fixedSelectedIndex);
                } else {
                    fix_Rtable
                    .setColumnSelectionInterval(selectedIndex, selectedIndex);
                }
            }
             // TODO Auto-generated method stub


     
    }