点击table中的某一项,弹出一个对话框。网上说要用编辑器,在某一列上加上编辑器就行了,我加了,第一次运行可以,但是,我隐藏掉对话框后,无论点击表格的哪一个地方,都出现对话框。这是什么情况,编辑没结束的原因吗?

解决方案 »

  1.   

    www.java2s.com网站有大量的示例
      

  2.   

    DefaultTableModel dm = new DefaultTableModel() {
          public boolean isCellEditable(int row, int column) {
            if (column == 0) {
              return true;
            }

            return false;
          }
        };如果有类似的地方,注意红色标注,只在你设定可以编辑的列里,才可以编辑。
      

  3.   

    //单元格编辑器
    MyCellEditor myCellEditor = new MyCellEditor();
    TableColumn index = table.getColumnModel().getColumn(2);
    index.setCellEditor(myCellEditor);
      

  4.   

    我将编辑器加载在了第三列上,下面是我自己写的编辑器
    /**
     * 单元格编辑器
     * 
     */
    static class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
     String strIndex = " ";
     private JPanel panel;
     static MyCellEditor n;
     JDialog dialog = null;
     JDialog dialognull = new JDialog();
     /**
     * 单态模式获取实例
     * @return SqlManager对象
     */
    public static MyCellEditor getInstance() {
    if (n == null) {
    n = new MyCellEditor();
    }
    return n;
    }

    //第二种机制
    public MyCellEditor() {
    // dialog = new JDialog(dialognull,"选择listtype",true);
    dialog = new JDialog();
    dialog.setTitle("选择listtype");
    dialog.setModal(true);

    dialog.setSize(300,300);

    JPanel panel = new JPanel();
    String str[] = {"类型1:对话,无参数","类型2:杀指定类型怪,参数1怪物类型ID,参数2杀怪数量","类型3:杀指定的怪,参数1怪物帐户ID,参数2杀怪数量","类型4:搜集物品,参数1物品ID,参数2物品数量","类型5:对指定怪物NPC使用物品,参数1NPCID,参数2物品ID","类型6:杀指定类型怪并且获得指定物品,参数1怪物类型ID,参数2怪物数量,参数3物品ID,参数4物品数量"};
    final JList list = new JList(str);
    list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

    JButton bt = new JButton("确定");
    bt.addActionListener(new ActionListener(){
    //取得选择的项的索引
    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    int index[] = list.getSelectedIndices();
    for(int i = 0 ; i< index.length; i++){
    index[i] = index[i]+1;
    if(i == index.length )
    strIndex += index[i] ;
    else if(i == 0)
    strIndex =  index[i] + ",";
    else
    strIndex += index[i] + ",";
    }
    System.out.println("取得列索引,用于返回,它的值是  :   " + strIndex);
    MyCellEditor.getInstance().setIndex(strIndex);
    MyCellEditor.getInstance().getCellEditorValue();
    MyCellEditor.getInstance().stopCellEditing();
    // dialog.setVisible(false);
    list.clearSelection();
    }
    });
    panel.add(bt);
    bt = new JButton("取消");
    bt.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    MyCellEditor.getInstance().cancelCellEditing();
    }
    });
    panel.add(bt);

    dialog.add(list,BorderLayout.CENTER);
    dialog.add(panel,BorderLayout.SOUTH);

    }

    public void setIndex(String str) {
    this.strIndex = str;
    }
     
    @Override
    public Object getCellEditorValue() {
    // TODO Auto-generated method stub
    //应该返回一个字符串
    System.out.println("返回的值是 : " +strIndex);
    // return tasktypeEdit.getInstance().getSelectIndex();
    return strIndex;
    } @Override
    public boolean isCellEditable(EventObject anEvent) {
    // TODO Auto-generated method stub

    return true;
    } @Override
    public boolean shouldSelectCell(EventObject anEvent) {
    //点击单元格时调用该方法
    // TODO Auto-generated method stub
    /*tasktypeEdit.getInstance().setVisible(true);
    tasktypeEdit.getInstance().setSize(300,300);*/
    System.out.println("开始编辑");
    dialog.setVisible(true);
    return true;
    } @Override
    public boolean  stopCellEditing() {
    // TODO Auto-generated method stub
    /*System.out.println("stopCellEditing");
    tasktypeEdit.getInstance().setVisible(false);*/
    //点击确定按钮时,调用该方法

    dialog.setVisible(false);
    System.out.println("编辑结束了");
    super.stopCellEditing();
    return true;
    } @Override
    public void cancelCellEditing() {
    //点击取消时调用该方法
    // TODO Auto-generated method stub
    System.out.println("你取消了操作    "+"cancelCellEditing()");
    // tasktypeEdit.getInstance().setVisible(false);
    dialog.setVisible(false);
    super.cancelCellEditing();
    } @Override
    public void addCellEditorListener(CellEditorListener l) {
    // TODO Auto-generated method stub

    } @Override
    public void removeCellEditorListener(CellEditorListener l) {
    // TODO Auto-generated method stub

    } @Override
    public Component getTableCellEditorComponent(JTable table,
    Object value, boolean isSelected, int row, int column) {
    // TODO Auto-generated method stub
     panel = new JPanel();
     
    return panel;
    }

    }
      

  5.   

    编辑器的构造方法去生成一个对话框,对话的确定按钮会调用MyCellEditor.getInstance().stopCellEditing();书上说这样是告诉系统你结束了编辑,会将编辑后的值传给getCellEditorValue(),在该方法中返回编辑后要返回的值,系统会调用 setValueAt(Object aValue, int rowIndex, int columnIndex)
      

  6.   

    发个例子给你(你修改下)。/**   
    * @Title: TableTest.java 
    * @Package com.yjb.test 
    * @Description: TODO(用一句话描述该文件做什么) 
    * @author 游建波    
    * @date 2010-9-13 下午03:13:10 
    * @version V1.0   
    */  
    package com.yjb.test;import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTable;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.table.DefaultTableModel;public class TableTest extends JFrame
    {
    private JTable table;

    public TableTest()
    {
    DefaultTableModel dm = new DefaultTableModel() {
          public boolean isCellEditable(int row, int column) {
            if (column == 0) {
              return true;
            }
            return false;
          }
        };
        dm.setDataVector(new Object[][] {
         { "请输入", "String", "JLabel", "JTextField" } ,
                { "请输入", "String", "JLabel", "JTextField" } }, new Object[] {
                "Component", "Data", "Renderer", "Editor" });
        
    table = new JTable(dm);

    table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
    {
    @Override
    public void valueChanged(ListSelectionEvent e) {
    tableSelectionChanged();
    }
    });
     getContentPane().add(table);
     setSize(400, 160);
     setVisible(true);
    }
    private void tableSelectionChanged() {
      int rowIndex = table.getSelectedRow();
      int cellIndex = table.getSelectedColumn();
      if(cellIndex == 0)
      {
      String value = JOptionPane.showInputDialog(null,"请输入值",
                    "Enter",JOptionPane.QUESTION_MESSAGE);
      //JOptionPane.showMessageDialog(null, "您选择的是  行 "+rowIndex+" 列 "+cellIndex);
      table.setValueAt(value, rowIndex, cellIndex);
      table.repaint();
      }
      //table.clearSelection();
      }
    public static void main(String args[])
    {
    TableTest t = new TableTest();
    t.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            System.exit(0);
          }
        });
    }
    }
      

  7.   

    哦,我用单根模式的原因,取消之后可以隐藏对话框了。你是不是要说明,加编辑器的时候,只要那个单元格是可编辑的,编辑器也会加到该单元格中啊?顺便问一句,怎样使发的代码是你那种有颜色标记的,我怎么没找到java code 呢?
      

  8.   


    这个问题我也遇到过,  我是这么解决的就是你在用单例模式的时候关闭dialog,其实那个实例还存在,所以在你在点击Jtable的时候dialog是不会显示的
    解决办法就在你 点击Jtable弹出dialog的事件里加上dialog.setVisible(true); 就没问题了