【发布时间】:2012-01-04 00:23:12
【问题描述】:
我有一个 JTable 和一个自定义 TableCellRenderer 和一个自定义 TableCellEditor。默认情况下,第一次点击表格行从renderer切换到editor,第二次点击选择行。
有什么方法可以让我在 单击 时选择行(并切换到编辑器)?
我试过用:
table.getSelectionModel().setSelectionInterval(row, row);
在我的getTableCellEditorComponent 中但它不起作用,如果我将它添加到我的getTableCellRendererComponent 中它会起作用,但只是有时。
这是一个完整的例子:
public class SelectRowDemo extends JFrame {
public SelectRowDemo() {
CellRendererAndEditor rendererAndEditor = new CellRendererAndEditor();
StringTableModel model = new StringTableModel();
JTable table = new JTable(model);
table.setDefaultEditor(String.class, rendererAndEditor);
table.setDefaultRenderer(String.class, rendererAndEditor);
model.addElement("");
model.addElement("");
model.addElement("");
add(new JScrollPane(table));
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
new SelectRowDemo();
}
});
}
class CellRendererAndEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private final JLabel renderer = new JLabel();
private final JLabel editor = new JLabel();
@Override
public Object getCellEditorValue() {
return editor.getText();
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
String str = "renderer ";
str += (isSelected) ? "selected" : "not selected";
renderer.setText(str);
return renderer;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
table.getSelectionModel().setSelectionInterval(row, row);
String str = "editor ";
str += (isSelected) ? "selected" : "not selected";
editor.setText(str);
return editor;
}
}
class StringTableModel extends AbstractTableModel {
private final List<String> data = new ArrayList<String>();
@Override
public int getColumnCount() {
return 1;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt(int row, int column) {
return data.get(row);
}
@Override
public Class<?> getColumnClass(int column) {
return String.class;
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
@Override
public void setValueAt(Object aValue, int row, int column) {
if(aValue instanceof String) {
data.set(row, (String)aValue);
fireTableRowsUpdated(row, column);
} else throw new IllegalStateException("aValue is not a String");
}
public void addElement(String s) {
data.add(s);
}
}
}
【问题讨论】:
-
你试过了吗
XxxCellEditor#setClickCountToStart() -
您不应该尝试在编辑器中更改选择模型(或表格的任何属性)。编辑器是用来编辑的。
-
@mKorbel:该方法不相关。
-
我不明白这个问题的最终目标。是好奇心吗?如果调用了编辑器,那么显然该行已被选中。为什么编辑不能假设这一点?编辑器的目的是允许用户输入新数据,然后将数据保存在模型中。数据是否保存正确?如果您尝试基于行对数据进行某种验证,那么我猜这应该在编辑器的停止编辑方法中完成,此时我猜所选行可用。
-
我正面临这个确切的问题。有人有解决办法吗?
标签: java swing jtable selection tablecelleditor