如何去掉指定Jtable某一列的焦点?
比如我用TAB切换焦点的时候,遇到某一列的时候,将焦点跳到下一个cell中?

解决方案 »

  1.   

    我能想到的办法
    为列执行获得焦点的事件处理,好像是 addListSelectionListener一旦发现不是你要的列,比如不能编辑的列,切换到下一个列
      

  2.   

    举个例子,假设跳过第二列    private JTable getJTable() {
            if (jTable == null) {
                jTable = new JTable(); //......             InputMap im = jTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);            KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);            final Action oldTabAction = jTable.getActionMap().get(im.get(tab));
                Action tabAction = new AbstractAction() {
                    private static final long serialVersionUID = 1L;                public void actionPerformed(ActionEvent e) {
                        oldTabAction.actionPerformed(e);
                        JTable table = (JTable) e.getSource();
                        int rowCount = table.getRowCount();
                        int row = table.getSelectedRow();                    if (column == 2) {// 如果移动到了第二列,则跳到下一列
                            column += 1;
                        } 
                        table.changeSelection(row, column, false, false);
                    }
                };
                jTable.getActionMap().put(im.get(tab), tabAction); //......        }
            return jTable;
        }
      

  3.   

    不好意思,没测试,代码有点错误,将                    int rowCount = table.getRowCount();改成                    int column = table.getSelectedColumn();
      

  4.   

    package com.ebis.util;
    import javax.swing.JTable;
    import javax.swing.table.TableModel;
    import javax.swing.table.TableColumnModel;
    import javax.swing.ListSelectionModel;
    import java.util.Vector;
    import java.awt.event.KeyEvent;
    import javax.swing.KeyStroke;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JTextField;
    import javax.swing.JComboBox;
    /**
    * <p>Title: 医院端医保结算系统</p>
    * <p>Description: 主类</p>
    * <p>Copyright: Copyright (c) 2001</p>
    * <p>Company: ebis</p>
    * @author not attributable
    * @version 1.0
    */
    public class VTable
        extends JTable {
      private boolean[] cellLock;
      public VTable() {
      }
      public VTable(TableModel p0) {
        super(p0);
      }
      public VTable(TableModel p0, TableColumnModel p1) {
        super(p0, p1);
      }
      public VTable(TableModel p0, TableColumnModel p1, ListSelectionModel p2) {
        super(p0, p1, p2);
      }
      public VTable(int p0, int p1) {
        super(p0, p1);
      }
      public VTable(Vector p0, Vector p1) {
        super(p0, p1);
      }
      public VTable(Object[][] p0, Object[] p1) {
        super(p0, p1);
      }
      public static void main(String[] args) {
        VTable VTable1 = new VTable();
      }
      public void selectCell(int row, int col) {
        this.setRowSelectionInterval(row, row);
        this.setColumnSelectionInterval(col, col);
      }
      public void setFocusMoveHorizontal(boolean flag) {
        if (flag) {
          this.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
              put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
                  "selectNextColumnCell");
        }
        else {
          this.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
              put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "");
        }
      }
      public boolean isCellEditable(int row, int col) {
        return this.cellLock[col];
      }
      //规定那几列不可以编辑
      public void setCellLock(boolean[] cellLock) {
        this.cellLock = cellLock;
      }
      //编辑单元
      public void editCell(int row,int col){
        this.editCellAt(row, col);
        Object o=((DefaultCellEditor) this.getCellEditor(row, col)).getComponent();
        if(o instanceof JTextField){
          JTextField jText = (JTextField)o;
          jText.requestFocus();
          jText.selectAll();
        }else{
          JComboBox c=(JComboBox)o;
          c.requestFocus();
        }
      }
      //设置列宽,先有内容后在设置宽度
      public void setColumnWidth(int[] widths)throws Exception{
        if(this.getColumnModel().getColumnCount()!=widths.length)throw new Exception("表格列数与参数(宽度)列数不对");
        this.setAutoResizeMode(this.AUTO_RESIZE_OFF);
        for(int i=0;i<widths.length;i++){
          this.getColumnModel().getColumn(i).setPreferredWidth(widths[i]);
        }
      }
      

  5.   

    package com.ebis.util;
    import javax.swing.*;
    import javax.swing.table.JTableHeader;
    import java.awt.*;
    import javax.swing.table.DefaultTableModel;
    import java.awt.event.FocusListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.KeyListener;
    import java.util.EventListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    /**
    * <p>Title: 医院端医保结算系统</p>
    * <p>Description: 测试类</p>
    * <p>Copyright: Copyright (c) 2001</p>
    * <p>Company: ebis</p>
    * @author not attributable
    * @version 1.0
    */
    public class Test
        extends JFrame {
      JScrollPane jScrollPane1 = new JScrollPane();
      VTable jTable1 = new VTable();
      JComboBox c = new JComboBox();
      public static void main(String[] args) {
        Test t = new Test();
      }
      public Test() {
        try {
          jbInit();
          this.setBounds(100, 100, 400, 400);
          this.setVisible(true);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
      private void jbInit() throws Exception {
        this.getContentPane().setLayout(null);
        jScrollPane1.setBounds(new Rectangle(34, 33, 336, 236));
        jTable1.setRowSelectionAllowed(false);
        this.getContentPane().add(jScrollPane1, null);
        jScrollPane1.getViewport().add(jTable1, null);
        c.addItem("你");
        c.addItem("我");
        c.addItem("他");
        String[] title = new String[] {
            "a", "b", "c"};
        String[][] data = new String[][] {
            {
            "1", "你", "3"}
            , {
            "1", "我", "3"}
            , {
            "1", "他", "3"}
            , {
            "1", "他", "3"}
            , {
            "1", "他", "3"}
        };
        DefaultTableModel dtm = new DefaultTableModel(data, title);
        jTable1.setFocusMoveHorizontal(false);
        jTable1.setModel(dtm);
        jTable1.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c));
        jTable1.selectCell(0, 0);
        jTable1.setRowHeight(25);
        jTable1.setColumnWidth(new int[]{100,100,100});    jTable1.setCellLock(new boolean[] {false, true, true});
        jTable1.addFocusListener(new FocusListener() {
          public void focusGained(FocusEvent focusEvent) {
            VTable table = (VTable) focusEvent.getSource();
            System.out.println("row:" + table.getSelectedRow());
            System.out.println("col:" + table.getSelectedColumn());
            System.out.println("-----------");
          }
          public void focusLost(FocusEvent focusEvent) {
          }
        });
        jTable1.addKeyListener(new KeyAdapter() {
          public void keyPressed(KeyEvent e) {
            VTable table = (VTable) e.getSource();
            int row = table.getSelectedRow();
            int col = table.getSelectedColumn();
            int colCount = table.getColumnCount();
            int rowCount = table.getRowCount();
            if (e.getKeyCode() == e.VK_ENTER) {
              if (col == colCount - 1) {
                if (rowCount - 1 == row) {
    //              row = 0;
                  col = 0;
                  DefaultTableModel dtm=(DefaultTableModel)table.getModel();
                  dtm.addRow(new String[]{"","",""});
                  row++;
    //              table.selectCell(0,0);
                }
                else {
                  row++;
                  col = 0;
    //              table.selectCell(row+1,0);
                }
              }
              else {
                col++;
    //            table.selectCell(row,col+1);
              }
              table.selectCell(row, col);
              table.editCell(row,col);        }
          }
        });
      }
      

  6.   

    getTableCellRendererComponent
    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row,
                                                   int column)重写上面这个方法,如果你要屏蔽焦点的列获得了焦点,则用下面的代码返回,否则返回默认:
    if(column == 3) {
    super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
    } else {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }