[英]Java Swing JTree: how to change the focus on the last created node
我的項目中有一個 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();
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.