JTable的JComboBox细胞编辑器中打开列表时,即使点击了组合框外已设置的值.此外,一旦选择了某个值,下次打开选择时,该值将成为默认值:
这是代码:
public class Main {
public static void main(String[] args) {
new QuestionFrame();
}
}
Run Code Online (Sandbox Code Playgroud)
QuestionFrame:
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
class QuestionFrame extends JFrame {
QuestionFrame(){
class Model {
int num;
private Model(int n) { num = n; }
}
final Model[] model = {new Model(9), new Model(8), new Model(7)};
JPanel panel = new JPanel(new BorderLayout());
JTable table = new JTable(new AbstractTableModel(){
@Override public int getRowCount() { return model.length; }
@Override public int getColumnCount() { return 1; }
@Override public Object getValueAt(int rowIndex, int columnIndex) {
return model[rowIndex].num;
}
@Override public String getColumnName(int column){ return "NUM"; }
@Override public Class<?> getColumnClass(int columnIndex) { return Integer.class; }
@Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; }
@Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
model[rowIndex].num = (int) aValue;
}
});
DefaultCellEditor cellEditor = new DefaultCellEditor(new JComboBox<>(new Integer[]{1,2,3}));
cellEditor.setClickCountToStart(1);
table.getColumnModel().getColumn(0).setCellEditor(cellEditor);
panel.add(new JScrollPane(table), BorderLayout.CENTER);
setBounds(new Rectangle(500,250,200,200));
add(panel);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
这有点意义,因为setCellEditor(cellEditor)重用相同的JComboBox对象实例,但我找不到另一种方法来做它.
那怎么解决呢?
您的问题是因为当前单元格值不是组合框编辑器的可能选择之一,因此组合默认为第一个选择.如果更改编辑器以包含当前值,例如,
DefaultCellEditor cellEditor = new DefaultCellEditor(
new JComboBox<>(new Integer[] { 1, 2,3, 4, 5, 6, 7, 8, 9 }));
Run Code Online (Sandbox Code Playgroud)
然后它工作正常,如预期的那样.
如果你想对编辑器进行更细粒度的控制,那么你将需要自己滚动而不使用默认编辑器.
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |