Java 如何在cellchange上创建JTable选择所有文本
我见过一些这样做的例子,但我仍然不能理解,也不能实现它 我想做的是单元格更改(焦点),下一个选定的单元格将选择所有文本,用户可以完全更改它 有什么办法吗 //更新// 不知怎的,我终于写出了下面的课程,但是 实现这一点Java 如何在cellchange上创建JTable选择所有文本,java,swing,select,jtable,tablecelleditor,Java,Swing,Select,Jtable,Tablecelleditor,我见过一些这样做的例子,但我仍然不能理解,也不能实现它 我想做的是单元格更改(焦点),下一个选定的单元格将选择所有文本,用户可以完全更改它 有什么办法吗 //更新// 不知怎的,我终于写出了下面的课程,但是 实现这一点 setDefaultEditor(String.class,new Classes.CellEditor()) 不产生任何结果,不会抛出“尚未受支持” 我应该如何解决这个问题 import java.awt.Component; import java.util.EventObj
setDefaultEditor(String.class,new Classes.CellEditor()) 不产生任何结果,不会抛出“尚未受支持” 我应该如何解决这个问题
import java.awt.Component;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
public class CellEditor extends JTextField implements TableCellEditor {
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
// final JTextField ec = (JTextField) editorComponent;
//
// ec.setText((String) value);
//
// // selectAll, so that whatever the user types replaces what we just put there
// ec.selectAll();
//
// SwingUtilities.invokeLater(new Runnable() {
//
// public void run() {
// // make the component take the keyboard focus, so the backspace key works
// ec.requestFocus();
//
// SwingUtilities.invokeLater(new Runnable() {
//
// public void run() {
// // at this point the user has typed something into the cell and we
// // want the caret to be AFTER that character, so that the next one
// // comes in on the RHS
// ec.setCaretPosition(ec.getText().length());
// }
// });
// }
// });
// return editorComponent;
throw new UnsupportedOperationException("Not supported yet.");
}
public Object getCellEditorValue() {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean isCellEditable(EventObject anEvent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean shouldSelectCell(EventObject anEvent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean stopCellEditing() {
throw new UnsupportedOperationException("Not supported yet.");
}
public void cancelCellEditing() {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addCellEditorListener(CellEditorListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void removeCellEditorListener(CellEditorListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
这应该会有所帮助
关于editorComponent
,在哪里初始化此变量
变量editorComponent
是一个字段
而不是
class CellEditor extends JTextField implements TableCellEditor
考虑
class CellEditor extends DefaultCellEditor
然后你可以这样做:
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
JTextField ec = (JTextField) editorComponent;
if (isSelected) {
ec.selectAll();
}
return editorComponent;
}
附录:正如@所建议并在本文中所示,当鼠标单击开始编辑时,您可以有选择地重新排列selectAll()
JTable table = new JTable(model) {
@Override // Always selectAll()
public boolean editCellAt(int row, int column, EventObject e) {
boolean result = super.editCellAt(row, column, e);
final Component editor = getEditorComponent();
if (editor == null || !(editor instanceof JTextComponent)) {
return result;
}
if (e instanceof MouseEvent) {
EventQueue.invokeLater(() -> {
((JTextComponent) editor).selectAll();
});
} else {
((JTextComponent) editor).selectAll();
}
return result;
}
};
我想做的是单元格更改(焦点),下一个选定的单元格将选择所有文本,用户可以完全更改它
解决方案取决于您的确切要求。JTable有一个渲染器和一个编辑器
渲染通常只显示单元格中的文本。如果要在开始键入时替换文本,则需要做两件事:
a) 更改渲染器以“选定”状态显示文本,以便用户知道键入字符将删除现有文本
b) 更改编辑器以在调用时选择所有文本
这种方法相对比较困难,因为您需要为表中的每种不同数据类型(例如字符串、整数)提供自定义呈现程序
或者另一种方法是在每个单元格获得焦点时自动将其置于编辑模式,因此您只需更改编辑器即可选择文本
这种方法很简单,因为您只需执行以下操作:
JTable table = new JTable(data, columnNames)
{
// Place cell in edit mode when it 'gains focus'
public void changeSelection(
int row, int column, boolean toggle, boolean extend)
{
super.changeSelection(row, column, toggle, extend);
if (editCellAt(row, column))
{
Component editor = getEditorComponent();
editor.requestFocusInWindow();
((JTextComponent)editor).selectAll();
}
}
};
关于editorComponent,我应该在哪里初始化这个变量?这个
easy
方法可以添加到NetBeans表中吗?我的项目基本上完成了,除了默认的NetBeans调色板JTable很糟糕之外。但是这个项目已经超出了预算,所以我不想从头开始重新设计它的一部分。我还看到了您的精细表格全选编辑器示例,但不确定如何将其应用于NetBeans调色板JTable。@jacknad:camickr的有见地的文章也被引用和引用。向前看,考虑限制你使用的GUI编辑器的轮廓。好的解决方案。试过其他几种,但效果不如这个好。我正在使用GlazedList,上面的解决方案也适用于它。