如何去掉指定Jtable某一列的焦点? 如何去掉指定Jtable某一列的焦点?比如我用TAB切换焦点的时候,遇到某一列的时候,将焦点跳到下一个cell中? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我能想到的办法为列执行获得焦点的事件处理,好像是 addListSelectionListener一旦发现不是你要的列,比如不能编辑的列,切换到下一个列 举个例子,假设跳过第二列 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; } 不好意思,没测试,代码有点错误,将 int rowCount = table.getRowCount();改成 int column = table.getSelectedColumn(); 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]); } }} 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); } } }); }} getTableCellRendererComponentpublic 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);} 真想不通这个小代码为什么出错,关于Class 各位大哥大姐帮帮我啊! 新问题,关于java的运行速度问题 想知道哪里有相关java摄像头编程的文章或开发包 能否把string型转成timestamp型的 jacob报错 请问java里有没有存储颜色值的空间?(在线等) 菜鸟问题,java中的输入 谁能帮我看看下面的程序错在什么地方? double 类型 初始化问题 帮我看一下JAVA的IO问题. 怎样写从键盘读数字的程序代码?
为列执行获得焦点的事件处理,好像是 addListSelectionListener一旦发现不是你要的列,比如不能编辑的列,切换到下一个列
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;
}
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]);
}
}
}
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); }
}
});
}
}
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);
}