如何去掉指定Jtable某一列的焦点?

libbyls1982 2008-01-24 02:53:09
如何去掉指定Jtable某一列的焦点?
比如我用TAB切换焦点的时候,遇到某一列的时候,将焦点跳到下一个cell中?
...全文
205 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shan1119 2008-02-04
  • 打赏
  • 举报
回复
同意8楼,最恰当的做法.
IamHades 2008-02-03
  • 打赏
  • 举报
回复
完全可以用renderer来实现。。。。。。。。。
IamHades 2008-02-03
  • 打赏
  • 举报
回复
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);
}
olivesoup 2008-01-30
  • 打赏
  • 举报
回复
我真是服了楼上了,无语...
swvincent 2008-01-30
  • 打赏
  • 举报
回复
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);

}
}
});
}
}
swvincent 2008-01-30
  • 打赏
  • 举报
回复
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]);
}
}
}
olivesoup 2008-01-25
  • 打赏
  • 举报
回复
不好意思,没测试,代码有点错误,将

int rowCount = table.getRowCount();

改成

int column = table.getSelectedColumn();
olivesoup 2008-01-25
  • 打赏
  • 举报
回复
举个例子,假设跳过第二列

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;
}
老紫竹 2008-01-24
  • 打赏
  • 举报
回复
我能想到的办法
为列执行获得焦点的事件处理,好像是 addListSelectionListener

一旦发现不是你要的列,比如不能编辑的列,切换到下一个列

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧