【发布时间】:2016-03-20 23:13:48
【问题描述】:
对于某个列,我有一个带有 JCombobox 编辑器的 JTable。
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
public class TablePanel extends JPanel {
public TablePanel() {
JTable table = new JTable(new MyTableModel());
setComboboxColumn(table.getColumnModel().getColumn(1));
add(new JScrollPane(table));
}
public void setComboboxColumn(TableColumn cbColumn) {
JComboBox<String> comboBox = new JComboBox<>();
comboBox.addItem("Item 1");
comboBox.addItem("Item 2");
comboBox.addItem("Item 3");
cbColumn.setCellEditor(new DefaultCellEditor(comboBox));
}
private static class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Normal cell", "Combobox cell"};
private Object[][] data = {
{"Cell 1", "Item 2"},
{"Cell 2", "Item 1"},
{"Cell 3", "Item 1"},
{"Cell 4", "Item 3"},
};
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data[rowIndex][columnIndex] = aValue;
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("TablePanel");
frame.getContentPane().add(new TablePanel());
frame.pack();
frame.setVisible(true);
}
});
}
}
现在发生了什么:
- 当我第一次单击该列的单元格时,会立即显示组合框弹出窗口。
- 如果我单击同一列的其他单元格,组合框会显示,但弹出窗口仍然关闭。
- 如果我单击其他单元格,然后再次返回该列的某个单元格,组合框弹出窗口会立即再次显示。
我想要什么:
- 首先单击该列的单元格:组合框出现,但弹出列表保持关闭。
- 再次单击同一单元格:弹出列表出现。
我知道我可以使用cellEditor.setClickCountToStart(2),但在这种情况下,第二次点击必须在第一次点击之后的短时间内执行,我想避免这个限制。
【问题讨论】:
-
1.第一个。是关于焦点,我很重要,确定这里有很多时间,2.最后一个属性是以编程方式启动编辑器,3.没有 SSCCE / MCVE 很难回答这个问题
-
我用 SSCCE / MCVE 更新了问题。
标签: java swing combobox jtable tablecelleditor