gpt4 book ai didi

java - 如何使用自定义 TableCellEditor 通过单击选择表格行?

转载 作者:行者123 更新时间:2023-11-30 09:42:24 26 4
gpt4 key购买 nike

我有一个带有自定义 TableCellRenderer 和自定义 TableCellEditorJTable。默认情况下,第一次单击表格行会从渲染器切换到编辑器,第二次单击选择该行。

有什么方法可以通过单击(然后切换到编辑器)选中该行?

我尝试过使用:

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);
}

}

}

最佳答案

发生的事情是表格 UI 在更改选择之前开始编辑单元格。如果您在 getTableCellEditor() 和 shouldSelectCell() 中放置一个 println,编辑器首先被调用,isSelected == false,然后它调用 shouldSelectCell 并更改选择。

您可以在 BasicTableUI.adjustSelection(MouseEvent) 中确切地看到它发生的位置。

  boolean dragEnabled = table.getDragEnabled();

if (!dragEnabled && !isFileList && table.editCellAt(pressedRow, pressedCol, e)) {
setDispatchComponent(e);
repostEvent(e);
}

CellEditor editor = table.getCellEditor();
if (dragEnabled || editor == null || editor.shouldSelectCell(e)) {
table.changeSelection(pressedRow, pressedCol,
BasicGraphicsUtils.isMenuShortcutKeyDown(e),
e.isShiftDown());
}

至于渲染目的,我只是将其渲染为选中 == true,因为它会在该事件完成处理之前完成。

关于java - 如何使用自定义 TableCellEditor 通过单击选择表格行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8714919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com