请教一个修改JTable表格数据的问题 本帖最后由 iv111 于 2009-08-26 08:37:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把表格model作为参数传递给对话框,这样就可以修改表格数据了。确定按钮就把对话框上的数据给model,再visible=false;取消按钮,你只要visible=false就可以了。或者加上dispose。 需要对model显示调用修改数据的语句么? 已经重写了model的setValueAt(int row, int col)方法,把model的引用传过去后需要显示调用修改数据方法的语句么? 是不是应该在确定按钮里修改数据模型Arraylist的数据?然后调用model的fireTableDataChanged()方法?显示调用model的setValueAt后并没有改变JTable表格的数据啊? 对啊·~所有的改变都要 由确定按钮触发·~你可以把 对话框的class 作为一个内部类~~可以简单点·~ setValueAt方法到底是怎么用的?有例子能提供一个么,直接修改model然后通知表格更新数据这个用了但是想用一下setValueAt,看看到底是怎么用的 可以自己写一个实现了TableCellEditor接口的类,然后将该列的编辑器设置为这个类接口,通过Column.setCellEditor(TableCellEditor) class TextTableCellEditor extends AbstractCellEditor implements TableCellEditor{ private JDialog inputDialog; private JPanel panel=new JPanel(); private JPanel showPanel=new JPanel(); private JButton entry=new JButton("确定"); private JButton cancel=new JButton("取消"); private JTextField field=new JTextField(15); public TextTableCellEditor(JFrame owner){ panel.setLayout(new BorderLayout()); panel.add(field,BorderLayout.CENTER); JPanel tmp=new JPanel(); tmp.add(entry); tmp.add(cancel); panel.add(tmp,BorderLayout.SOUTH); inputDialog=new JDialog(owner,"输入值",true); inputDialog.add(panel); inputDialog.pack(); inputDialog.setLocationRelativeTo(owner); entry.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ stopCellEditing(); } }); cancel.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ cancelCellEditing(); } }); inputDialog.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent event) { cancelCellEditing(); } }); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { field.setText(value.toString()); return showPanel; } public boolean shouldSelectCell(EventObject anEvent) { inputDialog.setVisible(true); return true; } public void cancelCellEditing() { inputDialog.setVisible(false); super.cancelCellEditing(); } public boolean stopCellEditing() { inputDialog.setVisible(false); super.stopCellEditing(); return true; } public Object getCellEditorValue() { return field.getText(); }}[/code] lz试试,将那个列的编辑器设置为这个类,看是不是你要的效果 import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.table.*;class TextTableCellEditor extends AbstractCellEditor implements TableCellEditor{ private JDialog inputDialog; private JPanel panel=new JPanel(); private JPanel showPanel=new JPanel(); private JButton entry=new JButton("确定"); private JButton cancel=new JButton("取消"); private JTextField field=new JTextField(15); public TextTableCellEditor(JFrame owner){ panel.setLayout(new BorderLayout()); panel.add(field,BorderLayout.CENTER); JPanel tmp=new JPanel(); tmp.add(entry); tmp.add(cancel); panel.add(tmp,BorderLayout.SOUTH); inputDialog=new JDialog(owner,"输入值",true); inputDialog.add(panel); inputDialog.pack(); inputDialog.setLocationRelativeTo(owner); entry.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ stopCellEditing(); } }); cancel.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ cancelCellEditing(); } }); inputDialog.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent event) { cancelCellEditing(); } }); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { field.setText(value.toString()); return showPanel; } public boolean shouldSelectCell(EventObject anEvent) { inputDialog.setVisible(true); return true; } public void cancelCellEditing() { inputDialog.setVisible(false); super.cancelCellEditing(); } public boolean stopCellEditing() { inputDialog.setVisible(false); super.stopCellEditing(); return true; } public Object getCellEditorValue() { return field.getText(); }} 刚才太乱了 现在的问题是 表格的数据模型已经更新了 也调用了model的fireTableDataChanged()方法,但是在视图层也就是JTable的显示会延迟一秒,需要点一下单元格的其他地方才能显示更新后的数据,这是为什么? 下面是更新的部分代码 ,帮忙看下。 if(table.getSelectedColumn()==1){ list.get(table.convertRowIndexToModel(table.getSelectedRow())).get(0).setAar(Integer.valueOf(textField.getText().trim())); table.setValueAt(textField.getText().trim(), table.getSelectedRow(), table.getSelectedColumn()); } else list.get(table.convertRowIndexToModel(table.getSelectedRow())).get(0).setAdr(Integer.valueOf(textField.getText().trim())); 在更新完,试下revalidate()或repaint()看可不可以。如果就是要实现你说的这个功能没必要这么麻烦,TableCellEditor完全可以实现,它是JTable单元格的编辑器,sun公司这样做肯定效率也会很高。 看一下TableCellEditor和CellEditor的API吧 revalidate()或repaint()之前都试过了不可以,因为上面的面板是个简单模型,我做的比模型要复杂,所以要用上面的编程逻辑,现在考虑到点一下其他地方就可以更新,采用焦点控制一下应该就可以了吧。 table.getModel().fireTableDataChanged()方法可以令model数据改变后反应到table中去。 恩~单元格焦点替换用什么方法?要给table添加监听器还是直接有方法调用? 引用名(句柄).updateUI();可以解决问题 updateUI()会打乱界面布局,行宽,背景色全部初始化了。这个方法不可行 repaint(),revalidate(),validate()都不可以,updatUI可以但是会初始化我之前设置的界面背景色等等,所以不可以。 更新完,只要单击某个单元格就可以吗?如果是这样,那就是选择某个单元格。可以通过得到这个JTable的ListSelectionModel,调用setSelectionInterval(int index0, int index1)来选择这行。然后得到TableColumnModel的 ListSelectionModel,用同样的方法选择该列,这样就是选择了某个单元格。 yourJTable.getCellEditor().stopCellEditing()可以结束当前编辑单元,并自动触发相应事件细节请看http://www.diybl.com/course/3_program/java/javajs/20091009/178301.html JComboBox有没有,点击那个下拉三角时的触发事件啊? 一个新手的疑惑之类对象引用的关系 怎样的equals才安全? JFrame的标题栏怎么去掉? 服务器给客户端传6个数,客户端根据6个数画圆。为什么我的没画出来?小弟初学,谢谢指教! 变量类型可以自己定义吗?? Socket编程一问 一台电脑(包括机箱和显示器)有多大功率?(瓦) PART TIME合作方案 关于不同类成员变量的调用问题 新手问题 关于AWT 初学者请教
确定按钮就把对话框上的数据给model,再visible=false;
取消按钮,你只要visible=false就可以了。或者加上dispose。
Column.setCellEditor(TableCellEditor)
class TextTableCellEditor extends AbstractCellEditor implements TableCellEditor{
private JDialog inputDialog;
private JPanel panel=new JPanel();
private JPanel showPanel=new JPanel();
private JButton entry=new JButton("确定");
private JButton cancel=new JButton("取消");
private JTextField field=new JTextField(15);
public TextTableCellEditor(JFrame owner){
panel.setLayout(new BorderLayout());
panel.add(field,BorderLayout.CENTER);
JPanel tmp=new JPanel();
tmp.add(entry);
tmp.add(cancel);
panel.add(tmp,BorderLayout.SOUTH);
inputDialog=new JDialog(owner,"输入值",true);
inputDialog.add(panel);
inputDialog.pack();
inputDialog.setLocationRelativeTo(owner);
entry.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
stopCellEditing();
}
});
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
cancelCellEditing();
}
});
inputDialog.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event)
{
cancelCellEditing();
}
});
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column)
{
field.setText(value.toString());
return showPanel;
}
public boolean shouldSelectCell(EventObject anEvent)
{
inputDialog.setVisible(true);
return true;
} public void cancelCellEditing()
{
inputDialog.setVisible(false);
super.cancelCellEditing();
} public boolean stopCellEditing()
{
inputDialog.setVisible(false);
super.stopCellEditing();
return true;
} public Object getCellEditorValue()
{
return field.getText();
}}
[/code] lz试试,将那个列的编辑器设置为这个类,看是不是你要的效果
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
class TextTableCellEditor extends AbstractCellEditor implements TableCellEditor{
private JDialog inputDialog;
private JPanel panel=new JPanel();
private JPanel showPanel=new JPanel();
private JButton entry=new JButton("确定");
private JButton cancel=new JButton("取消");
private JTextField field=new JTextField(15);
public TextTableCellEditor(JFrame owner){
panel.setLayout(new BorderLayout());
panel.add(field,BorderLayout.CENTER);
JPanel tmp=new JPanel();
tmp.add(entry);
tmp.add(cancel);
panel.add(tmp,BorderLayout.SOUTH);
inputDialog=new JDialog(owner,"输入值",true);
inputDialog.add(panel);
inputDialog.pack();
inputDialog.setLocationRelativeTo(owner);
entry.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
stopCellEditing();
}
});
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
cancelCellEditing();
}
});
inputDialog.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event)
{
cancelCellEditing();
}
});
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column)
{
field.setText(value.toString());
return showPanel;
}
public boolean shouldSelectCell(EventObject anEvent)
{
inputDialog.setVisible(true);
return true;
} public void cancelCellEditing()
{
inputDialog.setVisible(false);
super.cancelCellEditing();
} public boolean stopCellEditing()
{
inputDialog.setVisible(false);
super.stopCellEditing();
return true;
} public Object getCellEditorValue()
{
return field.getText();
}}
刚才太乱了
list.get(table.convertRowIndexToModel(table.getSelectedRow())).get(0).setAar(Integer.valueOf(textField.getText().trim()));
table.setValueAt(textField.getText().trim(), table.getSelectedRow(), table.getSelectedColumn());
}
else
list.get(table.convertRowIndexToModel(table.getSelectedRow())).get(0).setAdr(Integer.valueOf(textField.getText().trim()));
如果就是要实现你说的这个功能没必要这么麻烦,TableCellEditor完全可以实现,它是JTable单元格的编辑器,sun公司这样做肯定效率也会很高。
引用名(句柄).updateUI();可以解决问题
如果是这样,那就是选择某个单元格。可以通过得到这个JTable的ListSelectionModel,调用setSelectionInterval(int index0, int index1)来选择这行。然后得到TableColumnModel的 ListSelectionModel,用同样的方法选择该列,这样就是选择了某个单元格。
细节请看http://www.diybl.com/course/3_program/java/javajs/20091009/178301.html