本帖最后由 iv111 于 2009-08-26 08:37:47 编辑

解决方案 »

  1.   

    把表格model作为参数传递给对话框,这样就可以修改表格数据了。
    确定按钮就把对话框上的数据给model,再visible=false;
    取消按钮,你只要visible=false就可以了。或者加上dispose。
      

  2.   

    需要对model显示调用修改数据的语句么?
      

  3.   

    已经重写了model的setValueAt(int row, int col)方法,把model的引用传过去后需要显示调用修改数据方法的语句么?
      

  4.   

    是不是应该在确定按钮里修改数据模型Arraylist的数据?然后调用model的fireTableDataChanged()方法?显示调用model的setValueAt后并没有改变JTable表格的数据啊?
      

  5.   

    对啊·~所有的改变都要 由确定按钮触发·~你可以把 对话框的class 作为一个内部类~~可以简单点·~
      

  6.   

    setValueAt方法到底是怎么用的?有例子能提供一个么,直接修改model然后通知表格更新数据这个用了但是想用一下setValueAt,看看到底是怎么用的
      

  7.   

    可以自己写一个实现了TableCellEditor接口的类,然后将该列的编辑器设置为这个类接口,通过
    Column.setCellEditor(TableCellEditor)
      

  8.   

     
    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试试,将那个列的编辑器设置为这个类,看是不是你要的效果
      

  9.   


    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();
       }}
     刚才太乱了
      

  10.   

    现在的问题是 表格的数据模型已经更新了 也调用了model的fireTableDataChanged()方法,但是在视图层也就是JTable的显示会延迟一秒,需要点一下单元格的其他地方才能显示更新后的数据,这是为什么?
      

  11.   

    下面是更新的部分代码 ,帮忙看下。 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()));

      

  12.   

    在更新完,试下revalidate()或repaint()看可不可以。
    如果就是要实现你说的这个功能没必要这么麻烦,TableCellEditor完全可以实现,它是JTable单元格的编辑器,sun公司这样做肯定效率也会很高。
      

  13.   

    看一下TableCellEditor和CellEditor的API吧
      

  14.   

    revalidate()或repaint()之前都试过了不可以,因为上面的面板是个简单模型,我做的比模型要复杂,所以要用上面的编程逻辑,现在考虑到点一下其他地方就可以更新,采用焦点控制一下应该就可以了吧。
      

  15.   

    table.getModel().fireTableDataChanged()方法可以令model数据改变后反应到table中去。
      

  16.   

    恩~单元格焦点替换用什么方法?要给table添加监听器还是直接有方法调用?
      

  17.   


    引用名(句柄).updateUI();可以解决问题
      

  18.   

    updateUI()会打乱界面布局,行宽,背景色全部初始化了。这个方法不可行
      

  19.   

    repaint(),revalidate(),validate()都不可以,updatUI可以但是会初始化我之前设置的界面背景色等等,所以不可以。
      

  20.   

    更新完,只要单击某个单元格就可以吗?
    如果是这样,那就是选择某个单元格。可以通过得到这个JTable的ListSelectionModel,调用setSelectionInterval(int index0, int index1)来选择这行。然后得到TableColumnModel的 ListSelectionModel,用同样的方法选择该列,这样就是选择了某个单元格。
      

  21.   

    yourJTable.getCellEditor().stopCellEditing()可以结束当前编辑单元,并自动触发相应事件
    细节请看http://www.diybl.com/course/3_program/java/javajs/20091009/178301.html