简化版:给定具有扩展了DefaultTableModel的TableModel的JTable,是否可以在不使用CellEditor的情况下选择具有String类的单元格中的所有文本?
详细版本:我制作了一个TableModel,它扩展了DefaultTableModel,并且只应具有可编辑的可选行。这是相关的部分:
class MyTableModel extends DefaultTableModel {
private List<String> columnNames;
private List<List<String>> strings;
/** editable stores the columns which we're allowed to change */
private List<Integer> editable;
public MyTableModel (List<String> columnNames, List<List<String>>
strings, List<Integer> editable) {
this.columnNames = columnNames;
this.strings = strings;
this.editable = editable;
}
public Object getValueAt(int row, int col) {
return strings.get(col).get(row);
return null;
}
public void setValueAt(Object value, int row, int col) {
strings.get(col).set(row, (String) value);
fireTableCellUpdated(row, col);
}
public boolean isCellEditable(int row, int col) {
return canEdit(col);
}
/**
* This method looks like it should be lumped into isCellEditable()
* But there's unique behavior I plan on having later for the first
* column and this will let my code down the road be much cleaner.
**/
public boolean canEdit(int col) {
return col != 0 && editable.indexOf(col) != -1;
}
}
据了解,DefaultTableModel将用字符串填充的单元格视为JTextFields。我们使用此表的地方是用两列填充它。带有文件名的不可编辑的列(如字符串),其后是可编辑的字符串的空列。选择一个可编辑的单元格后,我希望它设置其文本为文件名之前的文件名,然后选择所有文本(此后,用户执行的命令中每个文件都有可选的String字段,因此,如果文件名是关联的可编辑单元格不为空,它使用该值。我们不希望用户每次设置此文件名时都必须重新输入整个文件名,但也希望使他们能够在需要时快速输入该文件名。
该表具有一个MouseListener,它可以查看是否单击了可编辑单元格,如果可以单击,还可以在单元格前填充文件名。
table.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
JTable table = ((JTable) e.getSource());
MyTableModel model = (MyTableModel)table.getModel();
int row = table.rowAtPoint(e.getPoint());
int col = table.columnAtPoint(e.getPoint());
if(tableModel.canEdit(col))
tableModel.setValueAt(
tableModel.getValueAt(row, col - 1), row, col);
}
});
这工作正常,但我无法选择文本。我似乎找不到返回单元格组件的方法,并且添加了在网上找到的CellEditor,但是它没有任何改变。
class MyCellEditor extends DefaultCellEditor {
public MyCellEditor(JTextField textField) {
super(textField);
textField.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e ) {
textField.selectAll();
}
});
}
}
与此添加到表中:
for(int i = 0; i < table.getRowCount(); i++)
table.setCellEditor(new MyCellEditor(new
JTextField((String)table.getValueAt(i, 2))));
如果有一种方法可以完全省略CellEditor,那么事情会容易得多,但是如果我做过一些事情,例如弄乱了这些侦听器处理事件的顺序,我不介意包括其中。我要避免的是需要编写一些巨大的CellEditor或对所有代码进行大修,以增加一点点便利。
尝试将selectAll()
语句包装在中SwingUtilities.invokeLater(...)
。
请参阅:如何模拟DefaultCellEditor的“ onStartCellEditing”
有关在开始单元格编辑时在任何单元格中选择文本的一般示例:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句