各位大虾们,问题如下:
编辑节点结束时,要进行一定的检验,例如非法字符等,若非法则提示并不能退出编辑状态,或者退回到编辑前的状态,这2种哪种都行。怎么实现啊。拜托各位大侠了

解决方案 »

  1.   

    改写cellEditor
    需要注意的是,里面实际用于编辑的是一个realEditor
    默认是一个编辑框,而实际你设置的那个editor是包含了前面的一个图表的。
    不知道你能否理解我的意思?
      

  2.   

    改写cell时,重写哪个方法呢,在方法里写些什么呢?
      

  3.   


    import java.awt.BorderLayout;
    import java.awt.Container;import javax.swing.DefaultCellEditor;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultTreeCellEditor;
    import javax.swing.tree.DefaultTreeCellRenderer;public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private JTree tree; public MainFrame() {
    super();
    initUI();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(800, 600);
    setVisible(true);
    } private void initUI() {
    Container c = getContentPane();
    c.setLayout(new BorderLayout()); tree = new JTree();
    c.add(tree);
    tree.setEditable(true); final JTextField tf = new JTextField();
    tree.setCellEditor(new DefaultTreeCellEditor(tree,
    (DefaultTreeCellRenderer) tree.getCellRenderer(),
    new DefaultCellEditor(tf) { private static final long serialVersionUID = 1L; @Override
    public boolean stopCellEditing() {
    // 假设不可含有逗号
    String forbid = ",";
    String value = getCellEditorValue().toString();
    boolean rs = value.indexOf(forbid) >= 0;
    if (rs) {
    JOptionPane.showMessageDialog(MainFrame.this,
    "不允许包含逗号!");
    tf.selectAll();
    }else {
    super.stopCellEditing();
    }
    return !rs;
    } @Override
    public Object getCellEditorValue() {
    return tf.getText().trim();
    }
    }));
    } public static void main(String args[]) {
    new MainFrame();
    }}说几句,第一,这个代码写的比较草,很多规范不应该这样,我图方便了。
    第二,一些数据的初始化工作我都没有做,model都没有写,免得代码太长,你看的也乱。我只在重点的地方写了代码,其他的另外考虑。
    第三,谦虚一下哈,时间仓促,随意而为,也没测试,很可能会出现问题什么的。也欢迎指正。
      

  4.   

    再多说一句哈,我那个getCellEditorValue
    在这里没有什么太大的用处,和默认得到的基本一样,我是trim了一下。
    而且……
    只是个人习惯,改写这个方法,你根据你自己的看是否需要。
    呵呵,读些swing的源代码,理解就会更深刻了
      

  5.   

    请问你所说的图标,指的是编辑时候的呢,还是非编辑状态下展示的?
    这个应该用到cellRender。
    请说的详细些。
      

  6.   

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Container;import javax.swing.DefaultCellEditor;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultTreeCellEditor;
    import javax.swing.tree.DefaultTreeCellRenderer;public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private JTree tree; public MainFrame() {
    super();
    initUI();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(800, 600);
    setVisible(true);
    } private void initUI() {
    Container c = getContentPane();
    c.setLayout(new BorderLayout()); tree = new JTree();
    c.add(tree);
    tree.setEditable(true); final JTextField tf = new JTextField(); DefaultTreeCellRenderer tr = new DefaultTreeCellRenderer();
    tr.setClosedIcon(new ImageIcon("images/1.gif"));
    tr.setOpenIcon(new ImageIcon("images/1.gif"));
    tr.setLeafIcon(new ImageIcon("images/1.gif"));
    // tree.setCellRenderer(new TCellRender());
    tree.setCellEditor(new DefaultTreeCellEditor(tree, tr,
    new DefaultCellEditor(tf) { private static final long serialVersionUID = 1L; @Override
    public boolean stopCellEditing() { // 假设不可含有逗号
    String forbid = ",";
    String value = getCellEditorValue().toString();
    boolean rs = value.indexOf(forbid) >= 0;
    if (rs) {
    JOptionPane.showMessageDialog(MainFrame.this,
    "不允许包含逗号!");
    tf.selectAll();
    } else {
    super.stopCellEditing();
    }
    return !rs;
    } // @Override
    // public Object getCellEditorValue() {
    // return tf.getText().trim();
    // }
    }));
    } public static void main(String args[]) {
    new MainFrame();
    }}改成这样。这个简单。
      

  7.   

    你换成你自己的图标就是了。找准路径。构建Editor的时候需要传递进去一个Render,就是用来渲染前面的图标的。不然的话,你如果写一个null,就没有前面的图标,而完全是一个编辑框了,也就是完全是里面那个realEditor了。嗯,这个没有体现出realEditor。就是构建Editor时候的第三个参数。
    这个构造有一个重载,只传递前两个也行,实际编辑器使用默认的,其实就是一个文本框。
      

  8.   

    呵呵。谢谢啊,原来我有DefaultTreeCellRenderer,放到后面了。。没注意
    太感谢你了..我要认识你。肯定请你吃饭了。。