jtree的节点编辑问题 各位大虾们,问题如下:编辑节点结束时,要进行一定的检验,例如非法字符等,若非法则提示并不能退出编辑状态,或者退回到编辑前的状态,这2种哪种都行。怎么实现啊。拜托各位大侠了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 改写cellEditor需要注意的是,里面实际用于编辑的是一个realEditor默认是一个编辑框,而实际你设置的那个editor是包含了前面的一个图表的。不知道你能否理解我的意思? 改写cell时,重写哪个方法呢,在方法里写些什么呢? 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都没有写,免得代码太长,你看的也乱。我只在重点的地方写了代码,其他的另外考虑。第三,谦虚一下哈,时间仓促,随意而为,也没测试,很可能会出现问题什么的。也欢迎指正。 再多说一句哈,我那个getCellEditorValue在这里没有什么太大的用处,和默认得到的基本一样,我是trim了一下。而且……只是个人习惯,改写这个方法,你根据你自己的看是否需要。呵呵,读些swing的源代码,理解就会更深刻了 请问你所说的图标,指的是编辑时候的呢,还是非编辑状态下展示的?这个应该用到cellRender。请说的详细些。 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(); }}改成这样。这个简单。 你换成你自己的图标就是了。找准路径。构建Editor的时候需要传递进去一个Render,就是用来渲染前面的图标的。不然的话,你如果写一个null,就没有前面的图标,而完全是一个编辑框了,也就是完全是里面那个realEditor了。嗯,这个没有体现出realEditor。就是构建Editor时候的第三个参数。这个构造有一个重载,只传递前两个也行,实际编辑器使用默认的,其实就是一个文本框。 呵呵。谢谢啊,原来我有DefaultTreeCellRenderer,放到后面了。。没注意太感谢你了..我要认识你。肯定请你吃饭了。。 关于GridBagLayout的一个简单问题 求解正则表达式题 关于sqlserver返回自增主键,急 为什么“非静态的内部类中的成员不能定义成静态的”? 晕了,昨天我的分还多些,怎么今天还少了?是什么问题?? [请教]byte[]与字符串转换的问题 想用JAVA SE写一个DNF连发。。 jBuilder6中文显示问题! Java中如何让程序暂停一段时间?或暂将处理器控制权交给系统?(或类似VB中的DoEvents()) 这个代码为什么报错 关于网络编程中的NullPointer异常 关于hql的一个问题,查询方法有误,请高手指点
需要注意的是,里面实际用于编辑的是一个realEditor
默认是一个编辑框,而实际你设置的那个editor是包含了前面的一个图表的。
不知道你能否理解我的意思?
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都没有写,免得代码太长,你看的也乱。我只在重点的地方写了代码,其他的另外考虑。
第三,谦虚一下哈,时间仓促,随意而为,也没测试,很可能会出现问题什么的。也欢迎指正。
在这里没有什么太大的用处,和默认得到的基本一样,我是trim了一下。
而且……
只是个人习惯,改写这个方法,你根据你自己的看是否需要。
呵呵,读些swing的源代码,理解就会更深刻了
这个应该用到cellRender。
请说的详细些。
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();
}}改成这样。这个简单。
这个构造有一个重载,只传递前两个也行,实际编辑器使用默认的,其实就是一个文本框。
太感谢你了..我要认识你。肯定请你吃饭了。。