Java 替换JScrollPane中的JTree后的奇怪行为
这是我们的后续问题。我尝试使用以下代码将JTree放置在JScrollPane中。JTree的初始化看起来很好,在JTextField中键入100,然后回车也很好。但当我滚动垂直幻灯片、调整窗口大小或尝试展开新的JTree节点时,我发现树返回到只有10个节点的原始状态。谢谢你的帮助Java 替换JScrollPane中的JTree后的奇怪行为,java,swing,Java,Swing,这是我们的后续问题。我尝试使用以下代码将JTree放置在JScrollPane中。JTree的初始化看起来很好,在JTextField中键入100,然后回车也很好。但当我滚动垂直幻灯片、调整窗口大小或尝试展开新的JTree节点时,我发现树返回到只有10个节点的原始状态。谢谢你的帮助 import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class RandomJTree2 extends JFrame {
private final JTextField jtf = new JTextField(10);
private JTree tree;
JScrollPane jsp;
private Random generator = new Random();
private JTree buildTree(int nnodes) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(0);
DefaultMutableTreeNode cnode = node;
for (int i = 1; i <= nnodes; i++) {
System.out.println(i);
DefaultMutableTreeNode newn = new DefaultMutableTreeNode(i);
int j = generator.nextInt(2);
System.out.println("j=" + j);
if (j == 0 && i != 1) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)cnode.getParent();
if (parent != null) {
parent.add(newn);
cnode = parent;
} else {
node.add(newn);
cnode = newn;
}
} else {
cnode.add(newn);
cnode = newn;
}
}
return new JTree(node);
}
public RandomJTree2() {
setLayout(new BorderLayout());
add(jtf, BorderLayout.NORTH);
tree = buildTree(10);
jsp = new JScrollPane(tree);
add(jsp, BorderLayout.CENTER);
jtf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
invalidate();
// jsp.remove(tree);
// tree = buildTree(Integer.parseInt(jtf.getText()));
// jsp.add(tree);
// remove(jsp);
tree = buildTree(Integer.parseInt(jtf.getText()));
jsp = new JScrollPane(tree);
add(jsp, BorderLayout.CENTER);
validate();
}
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
pack();
setVisible(true);
}
public static void main(String[] args) {
new RandomJTree2();
}
}
导入java.awt.BorderLayout;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.JTree;
导入javax.swing.tree.DefaultMutableTreeNode;
公共类RandomJTree2扩展了JFrame{
专用最终JTextField jtf=新JTextField(10);
私有JTree树;
JScrollPane-jsp;
专用随机生成器=新随机();
私有JTree构建树(int nnodes){
DefaultMutableTreeNode=新的DefaultMutableTreeNode(0);
DefaultMutableTreeNode cnode=节点;
对于(inti=1;i,您可以:
tree = buildTree(Integer.parseInt(jtf.getText()));
remove(jsp); //<--------------------
jsp = new JScrollPane(tree);
add(jsp, BorderLayout.CENTER);
validate();
tree=buildTree(Integer.parseInt(jtf.getText());
删除(jsp);//微小的附加注释,当文本字段为空(或格式无效的数字)时,如果在文本字段中按enter键,则会出现错误
谢谢!我本以为我试过了,但没用。不管怎样,现在效果很好。:)重新验证()+重新喷漆()防止Swing重新喷漆时出现任何可能的问题+1@mKorbel:你是说我不需要添加和删除,只需重新验证和重新绘制就足够了吗?@Liang这两行代码适用于所有情况,添加/删除/替换JComponents,更改/调整/减少LayoutManager中的某些内容,你必须删除,然后添加,最后一行代码将是rev验证日期+重绘:-)这应该是炼金术/挥杆技巧
try {
int yourNumer = Integer.parseInt(jtf.getText()); // pass this to buildTree()
if (key == KeyEvent.VK_ENTER) {// do your stuff}
} catch (NumberFormatException e){
// show a dialog or somthing :D
}