我正在尝试编写一些代码,允许用户通过单击JTable
中的布尔单元格来填充文本字段。
我可以让程序将表中的数据输入到文本字段中,但我当前的这种方法涉及一个JOptionPane,由于某些奇怪的原因,它会阻止表更改复选框值(即检查 - 框不会从黑色变为勾选)。不仅如此,选择不会更新,因此最后一列中的值仍为false,即使选择应将其切换为true。
我认为这可能与JOptionPane
以某种方式覆盖选择事件有关,但我不太了解JOptionPane
对象如何说明。我的代码是:
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
if (lsm.isSelectionEmpty()) {
//no rows are selected do nothing
} else {
//First find the row clicked
int selectedRow = lsm.getLeadSelectionIndex();
/*
* put a popup here to ask the user which peak to associate
* the energy with.
*/
System.out.println(selectedRow);
//Get user to associate with a peak
availablePeaks = getAvailablePeaks();
String returnVal = (String) JOptionPane.showInputDialog(
null,
"Select the peak:",
"Peak Matching",
JOptionPane.QUESTION_MESSAGE,
null,
availablePeaks, null);
System.out.println(returnVal);
//Determine the selection
int index = 0;
for (int i = 0; i < availablePeaks.length; i++) {
if (availablePeaks[i] == returnVal) {
index = i;
} else {
}
}
//Set the peak value in the peak specifier to the energy in the row
double energy = (Double) table.getValueAt(selectedRow, 0);
System.out.println(energy);
frame.getPeakSetter().getPeakSpecifiers()[index].setEnergy(energy);
frame.getPeakSetter().getPeakSpecifiers()[index].getTextField().setText("" + energy);
}
}
});
有谁知道为什么JOptionPane
中的ListSelectionListener
会阻止表更新复选框?
谢谢!
答案 0 :(得分:2)
我假设您的模型为true
返回isCellEditable()
,getColumnClass()
为Boolean.class
列返回JCheckBox
。这将启用默认的rednerer / editor,列出here。
看起来选择行的手势正在打开对话框。目前尚不清楚这是如何阻止DefaultCellEditor
结束的;这个对我有用。由于您没有检查getValueIsAdjusting()
,我很惊讶您没有看到两个ListSelectionEvent
个实例。
在任何情况下,每次选择更改时都会显示一个对话框,这看起来很麻烦。有几种选择是可能的:
保留ListSelectionListener
,通过从false
返回isCellEditable()
来使单元格不可编辑,并且只有在对话框成功结束时才在模型中设置其值。
放弃ListSelectionListener
,转而使用JButton
编辑器,显示为here。
放弃ListSelectionListener
,转而使用自定义CellEditor
,如下所示。
table.setDefaultEditor(Boolean.class, new DefaultCellEditor(new JCheckBox()) {
@Override
public boolean stopCellEditing() {
String value = JOptionPane.showInputDialog(...);
...
return super.stopCellEditing();
}
});