java - Java Swing JTree:如何将焦点更改在最后创建的节点上
问题描述
我的项目中有一个 Swing Jtree。我有一个 addNewItem 方法,它允许创建一个新节点。问题是如何在自动创建新节点后立即将焦点从当前元素更改为最后创建的节点,如图所示?
public void addNewItem(){
DefaultMutableTreeNode node = ((DefaultMutableTreeNode)getTree().getLastSelectedPathComponent());
if(node==null) return;
Holder h_node = (Holder) node.getUserObject();
String key = h_node.getData().getClass().getSimpleName();
BaseNodeAdapter adp = BaseNodeAdapter.of(key, h_node.getData());
while(adp==null && node!=null){
node = (DefaultMutableTreeNode) node.getParent();
h_node = (Holder) node.getUserObject();
key = h_node.getData().getClass().getSimpleName();
adp = BaseNodeAdapter.of(key, h_node.getData());
}
if(adp==null) return; // no adapter
System.out.println("addNewItem: adapter "+adp.getClass().getSimpleName());
String[] selectable = adp.getSelectable();
if(selectable.length==0) return; // no selectable
String strPath = Tools.getPath(node);
String type = (String)JOptionPane.showInputDialog(this,L("Create_a_new_item_for")+" "+key+":",strPath,JOptionPane.QUESTION_MESSAGE,null,selectable,null);
if(type!=null){
int res = adp.addItem(type);
System.out.println("add item : "+res);
if(res==BaseNodeAdapter.FAILED) return; // nothing
if(res==BaseNodeAdapter.PARENT) rebuildNode((DefaultMutableTreeNode) node.getParent());
else rebuildNode(node);
}
}
解决方案
就像是:
TreePath current = new TreePath(nodeYouJustCreated.getPath());
tree.setSelectionPath( current );
编辑:
只需单击按钮即可添加更多节点:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
public class TreeInsertMRE extends JPanel
{
private JTree tree;
private Random random = new Random();
private int tableNumber = 20;
public TreeInsertMRE()
{
super(new BorderLayout());
//Create the nodes.
DefaultMutableTreeNode top = new DefaultMutableTreeNode("Database");
getDatabases(top);
tree = new JTree(top);
JScrollPane scrollPane = new JScrollPane(tree);
add(scrollPane);
JButton button = new JButton("Add Table to Database 1");
add(button, BorderLayout.PAGE_END);
button.addActionListener(e ->
{
DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
DefaultMutableTreeNode child = (DefaultMutableTreeNode)model.getChild(root, 1);
String tableText = "Table " + tableNumber++;
DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode( tableText );
child.add(tableNode);
model.reload(child);
TreePath current = new TreePath(tableNode.getPath());
tree.setSelectionPath( current );
});
}
private void getDatabases(DefaultMutableTreeNode top)
{
for (int i = 0; i < 5; i++)
{
String databaseName = "Database" + i;
DefaultMutableTreeNode databaseNode = new DefaultMutableTreeNode(databaseName);
top.add(databaseNode);
getTables(databaseName, databaseNode);
}
}
private void getTables(String databaseName, DefaultMutableTreeNode databaseNode)
{
for (int i = 0; i < 5; i++)
{
String tableName = "Table" + i;
DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode(tableName);
databaseNode.add(tableNode);
getColumns(tableName, tableNode);
}
}
private void getColumns(String tableName, DefaultMutableTreeNode tableNode)
{
for (int i = 0; i < 5; i++)
{
String columnName = "Column" + i;
DefaultMutableTreeNode columnNode = new DefaultMutableTreeNode(columnName);
tableNode.add(columnNode);
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("TreeInsertMRE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TreeInsertMRE());
frame.setSize(300, 300);
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
推荐阅读
- laravel - Laravel 8:将被禁止的用户重定向到他们各自的主页
- reactjs - 未定义(未定义,未定义)中的 TypeScript 错误:找不到“组件发射器”的类型定义文件
- ruby-on-rails - ruby on rails 允许使用 frame_ancestors 内容安全策略或 X-Frame-Options 将您的网站嵌入其他站点
- c++ - 在 Ubuntu 20.04 中为 RPI4 链接 WiringPi 共享对象库
- android - Recyclerview 没有 LayoutManager android studio
- r - 如何制作分组条形图
- swift - 除非满足某些条件,否则是否有阻止滑块移动的方法?
- python - 当我尝试将 user_id 转换为 discord.py 上的成员用户名时,我不断收到 NoneType
- android - FirebaseUser 无法重新验证以删除帐户
- sql - 仅将 CONCAT 应用于名称 >25 个字符