只允许表头第一列或者某一列不可拖动,其他列可以拖动,请问怎么实现?
JTable的所有列是默认可以拖动的,
JTableHeader tableHeader = JTable.getTableHeader();
tableHeader.setReorderingAllowed(false);//表示所有的列都不可以拖动

解决方案 »

  1.   

    不动的这一列一般是ID这种字段,如果用两个table的话,数据模型实现的数据可能会不同步.
      

  2.   

    你说的编码我没有试过,应该可以吧,想问你一个问题,怎么在一个JScrollpane中添加两个JTable?
      

  3.   

    那像你所说的,用一个JScrollPane将两个JTable包含起来,然后还可以将第二个JTable可以拖动,这怎么实现呢?但是JScrollPane可以加两个JTable吗?不可以吧
      

  4.   

    看看是不是你要的
    package com.test;import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Arrays;
    import java.util.Vector;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JViewport;
    import javax.swing.table.DefaultTableColumnModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableColumnModel;public class TestTable extends JFrame { private static final long serialVersionUID = -3606700961317828681L; private JTable rowHeaderTable = null; private DefaultTableModel rowHeaderTableModel = null; private JTable table = null; private DefaultTableModel tableModel = null; public TestTable() {
    super("Test");
    init();
    } private void init() {
    this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(getCenterPanel(), BorderLayout.CENTER);
    this.getContentPane().add(getSouthPanel(), BorderLayout.SOUTH);
    this.pack();
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } private JPanel getSouthPanel() {
    JPanel panel = new JPanel();
    panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    JButton addBtn = new JButton("Add");
    addBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
    addCaseRow();
    }
    });
    JButton delBtn = new JButton("Delete");
    delBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
    removeCaseRows(table.getSelectedRows());
    }
    });
    panel.add(addBtn);
    panel.add(delBtn);
    return panel;
    } private JScrollPane getCenterPanel() {
    rowHeaderTable = new JTable(getRowHeaderTableModel(), getRowHeaderTableColumnModel());
    rowHeaderTable.getTableHeader().setReorderingAllowed(false);
    rowHeaderTable.setColumnSelectionAllowed(false);
    rowHeaderTable.getTableHeader().setReorderingAllowed(false);
    rowHeaderTable.getTableHeader().setResizingAllowed(false);
    rowHeaderTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    rowHeaderTable.setEnabled(false);
    JViewport jv = new JViewport();
    jv.setView(rowHeaderTable);
    int height = new Double(rowHeaderTable.getMaximumSize().getHeight()).intValue();
    jv.setPreferredSize(new Dimension(50, height));
    JScrollPane scrollPanel_main = new JScrollPane();
    table = new JTable(getTableModel(), getTableColumnModel());
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    scrollPanel_main.getViewport().add(table);
    scrollPanel_main.setRowHeader(jv);
    scrollPanel_main.setCorner(JScrollPane.UPPER_LEFT_CORNER, rowHeaderTable.getTableHeader());
    return scrollPanel_main;
    } private DefaultTableModel getRowHeaderTableModel() {
    rowHeaderTableModel = new DefaultTableModel(0, 1) { private static final long serialVersionUID = 1986093475481012619L; public boolean isCellEditable(int row, int column) {
    return false;
    }
    };
    return rowHeaderTableModel;
    } private DefaultTableModel getTableModel() {
    tableModel = new DefaultTableModel(0, 2) { private static final long serialVersionUID = 3325101167983738710L; public boolean isCellEditable(int row, int column) {
    return true;
    }
    }; return tableModel;
    } private TableColumnModel getTableColumnModel() {
    TableColumnModel columnModel = new DefaultTableColumnModel();
    for (int i = 0; i < 2; i++) {
    columnModel.addColumn(getTableColumns()[i]);
    }
    return columnModel;
    } private TableColumn[] getTableColumns() {
    TableColumn[] tableColumns = new TableColumn[2]; tableColumns[0] = new TableColumn(0, 200, null, null);
    tableColumns[0].setHeaderValue("Test1"); tableColumns[1] = new TableColumn(1, 200, null, null);
    tableColumns[1].setHeaderValue("Test2"); return tableColumns;
    } private TableColumnModel getRowHeaderTableColumnModel() {
    DefaultTableColumnModel rowHeaderColumnModel = new DefaultTableColumnModel();
    rowHeaderColumnModel.addColumn(getRowNumberColumn());
    return rowHeaderColumnModel;
    } private TableColumn getRowNumberColumn() {
    TableColumn rowNumberColumn = new TableColumn(0, 50, null, null);
    rowNumberColumn.setHeaderValue("ID");
    return rowNumberColumn;
    } private void addCaseRow() {
    int rowId = tableModel.getRowCount() + 1;
    Vector<String> headerVC = new Vector<String>();
    headerVC.add(String.valueOf(rowId));
    Vector<String> dataVC = new Vector<String>();
    dataVC.add("Test1:" + String.valueOf(rowId));
    dataVC.add("Test2:" + String.valueOf(rowId));
    rowHeaderTableModel.addRow(headerVC);
    tableModel.addRow(dataVC);
    } private void removeCaseRows(int[] rowIndex) {
    if (rowIndex.length > 0) {
    Arrays.sort(rowIndex);
    for (int i = rowIndex.length - 1; i >= 0; i--) {
    tableModel.removeRow(rowIndex[i]);
    rowHeaderTableModel.removeRow(rowIndex[i]);
    }
    }
    updateRowHeader();
    } private void updateRowHeader() {
    for (int i = 0; i < rowHeaderTableModel.getRowCount(); i++) {
    rowHeaderTableModel.setValueAt(i + 1, i, 0);
    }
    } public static void main(String[] args) {
    new TestTable();
    }}
      

  5.   

    你说的是jtable的前面几列的冻结,具体的没有做过,不过你可以试试jctable,jctable这边设置挺简单的。