Java:JTable-setSelectedIndex中的JComboBox对GUI没有影响
我有一个有两列的JTable。在第二列中,每一行都有不同的编辑器(JTextField、JComboBox和CheckComboBox)。到目前为止,它工作得很好,但是我已经实现了一个重置选项,它将整个JTable更改回原始状态(重置所有更改) 我现在面临的问题是,当我使用Java:JTable-setSelectedIndex中的JComboBox对GUI没有影响,java,swing,indexing,jtable,jcombobox,Java,Swing,Indexing,Jtable,Jcombobox,我有一个有两列的JTable。在第二列中,每一行都有不同的编辑器(JTextField、JComboBox和CheckComboBox)。到目前为止,它工作得很好,但是我已经实现了一个重置选项,它将整个JTable更改回原始状态(重置所有更改) 我现在面临的问题是,当我使用setSelectedIndex编程更改组合框的索引时,我在GUI中看不到任何结果,尽管模型使用fireTableDataChanged触发其更改,并且也由表的tablemodelstener接收。当我查找更改的组合框时,我也
setSelectedIndex
编程更改组合框的索引时,我在GUI中看不到任何结果,尽管模型使用fireTableDataChanged
触发其更改,并且也由表的tablemodelstener
接收。当我查找更改的组合框时,我也会得到正确的索引,但是它不会显示在GUI中。我还尝试了revalidate
、updateUI
和repaint
方法,但没有任何更改
问题可能在于它的架构(可能是渲染器?)。这是我的编辑器/渲染器类
class VEachRowEditor implements TableCellEditor, TableCellRenderer {
protected Hashtable<Integer, TableCellEditor> editors;
protected TableCellEditor editor, defaultEditor, renderer;
JTable table;
VEachRowEditorManager rowmanager;
public VEachRowEditor(JTable table, VEachRowEditorManager rowmanager) {
this.table = table;
editors = new Hashtable<Integer, TableCellEditor>();
defaultEditor = new DefaultCellEditor(new JTextField());
this.rowmanager = rowmanager;
}
public void setEditorAt(int row, TableCellEditor editor) {
if (editor instanceof DefaultCellEditor)
((DefaultCellEditor) editor).setClickCountToStart(1);
editors.put(new Integer(row), editor);
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
editor = (TableCellEditor) editors.get(new Integer(row));
if (editor == null) {
editor = defaultEditor;
}
return editor.getTableCellEditorComponent(table, value, isSelected,
row, column);
}
public Object getCellEditorValue() {
return editor.getCellEditorValue();
}
public final boolean stopCellEditing() {
return editor.stopCellEditing();
}
public void cancelCellEditing() {
editor.cancelCellEditing();
}
public boolean isCellEditable(EventObject anEvent) {
selectEditor((MouseEvent) anEvent);
return editor.isCellEditable(anEvent);
}
public void addCellEditorListener(CellEditorListener l) {
editor.addCellEditorListener(l);
}
public void removeCellEditorListener(CellEditorListener l) {
editor.removeCellEditorListener(l);
}
public boolean shouldSelectCell(EventObject anEvent) {
selectEditor((MouseEvent) anEvent);
return editor.shouldSelectCell(anEvent);
}
protected void selectEditor(MouseEvent e) {
int row;
if (e == null) {
row = table.getSelectionModel().getAnchorSelectionIndex();
} else {
row = table.rowAtPoint(e.getPoint());
}
editor = (TableCellEditor) editors.get(new Integer(row));
if (editor == null) {
System.out.println(editor);
editor = defaultEditor;
}
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
renderer = (TableCellEditor) editors.get(new Integer(row));
if (renderer == null) {
renderer = defaultEditor;
}
return renderer.getTableCellEditorComponent(table, value, isSelected,
row, column);
}
类VEachRowEditor实现TableCellEditor和TableCellRenderer{
受保护的哈希表编辑器;
受保护的TableCellEditor、defaultEditor、渲染器;
JTable表;
VEachRowEditorManager行管理器;
公共VEachRowEditor(JTable表,VEachRowEditorManager行管理器){
this.table=表格;
editors=newhashtable();
defaultEditor=新的DefaultCellEditor(新的JTextField());
this.rowmanager=rowmanager;
}
公共void集合编辑器(int行,TableCellEditor){
if(编辑器实例of DefaultCellEditor)
((DefaultCellEditor)编辑器)。设置ClickCountToStart(1);
put(新整数(行),编辑器);
}
公共组件getTableCellEditorComponent(JTable表、对象值、,
布尔值(选定,int行,int列){
editor=(TableCellEditor)editors.get(新整数(行));
如果(编辑器==null){
编辑器=默认编辑器;
}
返回编辑器.getTableCellEditorComponent(表、值、isSelected、,
行、列);
}
公共对象getCellEditorValue(){
返回editor.getCellEditorValue();
}
公共最终布尔stopCellEditing(){
return editor.stopCellEditing();
}
公共作废取消编辑(){
editor.cancelleediting();
}
公共布尔值isCellEditable(EventObject anEvent){
选择编辑器((MouseEvent)anEvent);
return editor.isCellEditable(anEvent);
}
public void addCellEditorListener(CellEditorListener l){
编辑者。addCellEditorListener(l);
}
public void removeCellEditorListener(CellEditorListener l){
编者:removeCellEditorListener(l);
}
公共布尔值shouldSelectCell(EventObject anEvent){
选择编辑器((MouseEvent)anEvent);
返回编辑器。shouldSelectCell(anEvent);
}
受保护的void selectEditor(MouseEvent e){
int行;
如果(e==null){
行=表.getSelectionModel().getAnchorSelectionIndex();
}否则{
row=table.rowAtPoint(如getPoint());
}
editor=(TableCellEditor)editors.get(新整数(行));
如果(编辑器==null){
System.out.println(编辑器);
编辑器=默认编辑器;
}
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
renderer=(TableCellEditor)editors.get(新整数(行));
if(渲染器==null){
renderer=defaultEditor;
}
返回renderer.getTableCellEditorComponent(表、值、isSelected、,
行、列);
}
}
getTableCellEditorComponent
是否错误
rowmanager
保存所有模型的所有JComboBox和复选框
当我用setSelectedIndex编程更改组合框的索引时,在GUI中看不到任何结果
渲染器和编辑器只显示模型中的数据。不要重置编辑器组件
重置模型中的数据。ie>
table.setValueAt(...); // or
table.getModel().setValueAt(...);
使用JComboBox很容易呈现JTable列。举了一个例子。请发布一个更快的答案。