英文:
How can we change the text of leaf node of jtree dynamically withour select and hover event?
问题
我的要求是在不选择和悬停事件的情况下更改叶节点文本的颜色。
示例:
如果我在输入框中输入“java”,然后点击按钮,点击事件后,Java叶节点文本变为红色。
英文:
My requirement is to change the color of leaf node text without select and hover event.
Example:
If I input java in inputbox and click on button, than Onclick event Java leaf node text become red.
答案1
得分: 3
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
public class TreeTest extends DefaultTreeCellRenderer implements ActionListener, Runnable {
private static final String CLICK = "Click";
private boolean changeColor;
private JFrame frame;
private JTextField textField;
private JTree tree;
@Override
public void actionPerformed(ActionEvent event) {
String actionCommand = event.getActionCommand();
switch (actionCommand) {
case CLICK:
changeColor = true;
tree.repaint();
break;
default:
}
}
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
Component cmpt = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object usrObj = node.getUserObject();
if (textField != null && textField.getText().equals(usrObj) && changeColor) {
cmpt.setForeground(Color.RED);
}
return cmpt;
}
@Override
public void run() {
createAndShowGui();
}
private void createAndShowGui() {
frame = new JFrame("JTree");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createTree(), BorderLayout.CENTER);
frame.add(createTopPanel(), BorderLayout.PAGE_START);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createTopPanel() {
JPanel topPanel = new JPanel();
JButton button = new JButton(CLICK);
button.addActionListener(this);
textField = new JTextField(6);
topPanel.add(textField);
topPanel.add(button);
return topPanel;
}
private JScrollPane createTree() {
tree = new JTree(createTreeModel());
tree.setCellRenderer(this);
JScrollPane scrollPane = new JScrollPane(tree);
return scrollPane;
}
private TreeModel createTreeModel() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Language");
root.add(new DefaultMutableTreeNode("Java"));
root.add(new DefaultMutableTreeNode("C"));
root.add(new DefaultMutableTreeNode("C++"));
DefaultTreeModel model = new DefaultTreeModel(root);
return model;
}
public static void main(String[] args) {
EventQueue.invokeLater(new TreeTest());
}
}
英文:
As far as I know, the only way to customize the display of a JTree
is via its cell renderer. Hence, in the below code, I have created a custom cell renderer that changes the text color of the requested node, after activating the button.
Note that the only purpose of the below code is to demonstrate how to achieve what you require. It is not meant to be a production-quality program. My hope and intention is that it gets you going towards completing your required task.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
public class TreeTest extends DefaultTreeCellRenderer implements ActionListener, Runnable {
private static final String CLICK = "Click";
private boolean changeColor;
private JFrame frame;
private JTextField textField;
private JTree tree;
@Override // java.awt.event.ActionListener
public void actionPerformed(ActionEvent event) {
String actionCommand = event.getActionCommand();
switch (actionCommand) {
case CLICK:
changeColor = true;
tree.repaint();
break;
default:
}
}
@Override // javax.swing.tree.DefaultTreeCellRenderer
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
Component cmpt = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object usrObj = node.getUserObject();
if (textField != null && textField.getText().equals(usrObj) && changeColor) {
cmpt.setForeground(Color.RED);
}
return cmpt;
}
@Override // java.lang.Runnable
public void run() {
createAndShowGui();
}
private void createAndShowGui() {
frame = new JFrame("JTree");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createTree(), BorderLayout.CENTER);
frame.add(createTopPanel(), BorderLayout.PAGE_START);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createTopPanel() {
JPanel topPanel = new JPanel();
JButton button = new JButton(CLICK);
button.addActionListener(this);
textField = new JTextField(6);
topPanel.add(textField);
topPanel.add(button);
return topPanel;
}
private JScrollPane createTree() {
tree = new JTree(createTreeModel());
tree.setCellRenderer(this);
JScrollPane scrollPane = new JScrollPane(tree);
return scrollPane;
}
private TreeModel createTreeModel() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Language");
root.add(new DefaultMutableTreeNode("Java"));
root.add(new DefaultMutableTreeNode("C"));
root.add(new DefaultMutableTreeNode("C++"));
DefaultTreeModel model = new DefaultTreeModel(root);
return model;
}
public static void main(String[] args) {
EventQueue.invokeLater(new TreeTest());
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论