![](/img/trans.png)
[英]How to dynamically change a JPanel with a CardLayout using a JTree Listener?
[英]I can't change card in cardLayout using JTree listener
我在CardLayout中更換卡時遇到問題。 我有一個使用CardLayout作為布局的JPanel,而另一個JPanel包含了帶有JTree的JPanel(在其他類中)。 我想添加TreeSelectionListener。 如果單擊該節點,則card應該更改為節點標題。
這是一些代碼:
我要換卡的監聽器在第159行的第二個代碼段中。
當我從ThumbPanel更改卡(具有JPanel和CardLayout作為布局的類)時,它可以工作,但是TreeSelectionListener在其他類中,並且當我嘗試從那里更改它時,什么也沒有發生。
帶有cardlayout的JPanel:
import com.alee.extended.image.WebImage;
import com.alee.managers.tooltip.TooltipManager;
import com.alee.managers.tooltip.TooltipWay;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
public class ThumbPanel extends JPanel{
public CardLayout cl = new CardLayout();
public ThumbPanel(){
super();
initComponents();
}
public void initComponents() {
final ThumbPopupMenu tpm = new ThumbPopupMenu();
setMinimumSize(new Dimension(200, 320));
setPreferredSize(new Dimension(650, 400));
setVisible(true);
setLayout(cl);
Border blackline = BorderFactory.createLineBorder(Color.black);
setBorder(blackline);
JPanel p1 = new JPanel();
p1.add(new JLabel("parent 1"));
JPanel p2 = new JPanel();
p2.add(new JLabel("parent 2"));
add(p1, "Parent 1");
add(p2, "Parent 2");
}
public void showCategoryPanel(String panelName){
cl.show(this, panelName);
}
}
這是JTreeHelper,其中包含TreeSelectionListener(在此代碼的底部)
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.Enumeration;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import net.miginfocom.swing.MigLayout;
public class JTreeHelper extends JPanel{
protected DefaultMutableTreeNode rootNode;
protected DefaultTreeModel treeModel;
protected JTree tree;
private Toolkit toolkit = Toolkit.getDefaultToolkit();
private ThumbPanel tp = new ThumbPanel();
public JTreeHelper() {
super();
ml = new MigLayout("",
"[]",
"[]");
setLayout(ml);
setMinimumSize(new Dimension(200, 320));
setPreferredSize(new Dimension(250, 400));
rootNode = new DefaultMutableTreeNode("Root Node");
treeModel = new DefaultTreeModel(rootNode);
treeModel.addTreeModelListener(new MyTreeModelListener());
tree = new JTree(treeModel);
tree.setEditable(true);
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(true);
//add JTree listeners
tree.addTreeSelectionListener(createSelectionListener());
JScrollPane scrollPane = new JScrollPane(tree);
scrollPane.setMinimumSize(new Dimension(200, 320));
scrollPane.setPreferredSize(new Dimension(250, 400));
scrollPane.setBorder(null);
add(scrollPane);
}
/** Remove all nodes except the root node. */
public void clear() {
rootNode.removeAllChildren();
treeModel.reload();
}
/** Remove the currently selected node. */
public void removeCurrentNode() {
TreePath currentSelection = tree.getSelectionPath();
if (currentSelection != null) {
DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)
(currentSelection.getLastPathComponent());
MutableTreeNode parent = (MutableTreeNode)(currentNode.getParent());
if (parent != null) {
treeModel.removeNodeFromParent(currentNode);
return;
}
}
// Either there was no selection, or the root was selected.
toolkit.beep();
}
/** Add child to the currently selected node. */
public DefaultMutableTreeNode addObject(Object child) {
DefaultMutableTreeNode parentNode = null;
TreePath parentPath = tree.getSelectionPath();
if (parentPath == null) {
parentNode = rootNode;
} else {
parentNode = (DefaultMutableTreeNode)
(parentPath.getLastPathComponent());
}
return addObject(parentNode, child, true);
}
public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child) {
return addObject(parent, child, false);
}
public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child,
boolean shouldBeVisible) {
DefaultMutableTreeNode childNode =
new DefaultMutableTreeNode(child);
if (parent == null) {
parent = rootNode;
}
//It is key to invoke this on the TreeModel, and NOT DefaultMutableTreeNode
treeModel.insertNodeInto(childNode, parent,
parent.getChildCount());
//Make sure the user can see the new node.
if (shouldBeVisible) {
tree.scrollPathToVisible(new TreePath(childNode.getPath()));
}
return childNode;
}
class MyTreeModelListener implements TreeModelListener {
public void treeNodesChanged(TreeModelEvent e) {
DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());
int index = e.getChildIndices()[0];
node = (DefaultMutableTreeNode)(node.getChildAt(index));
System.out.println("The user has finished editing the node.");
System.out.println("New value: " + node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e) {
}
public void treeNodesRemoved(TreeModelEvent e) {
}
public void treeStructureChanged(TreeModelEvent e) {
}
}
/*tree selection listener
*
* after click on tree node, the category is shown on the right
*
*
*/
private TreeSelectionListener createSelectionListener() {
return new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
TreePath path = e.getPath();
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) path.getLastPathComponent();
// HERE SHOULD CHANGE CARD
tp.cl.show(tp, parentNode.toString());
System.out.println(parentNode.toString());
}
};
}
/*
*
* Method which finds JTree node with given name
*
*/
public TreePath find(DefaultMutableTreeNode root, String s) {
@SuppressWarnings("unchecked")
Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration();
while (e.hasMoreElements()) {
DefaultMutableTreeNode node = e.nextElement();
if (node.toString().equalsIgnoreCase(s)) {
return new TreePath(node.getPath());
}
}
return null;
}
}
這是第三張卡,僅將JTree添加到gui。
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.xml.ws.BindingProvider;
import net.miginfocom.swing.MigLayout;
public class CategoryTreePanel extends JPanel{
private JTreeHelper treePanel;
public CategoryTreePanel(){
super();
initComponents();
}
public void initComponents() {
setMinimumSize(new Dimension(200, 320));
setPreferredSize(new Dimension(250, 400));
setVisible(true);
ml = new MigLayout("",
"[]",
"[]");
setLayout(ml);
Border blackline = BorderFactory.createLineBorder(Color.black);
setBorder(blackline);
treePanel = new JTreeHelper();
populateTree(treePanel, thumbPanel);
add(treePanel);
}
public void populateTree(JTreeHelper treePanel, JPanel mainPanel) {
String p1Name = new String("Parent 1");
String p2Name = new String("Parent 2");
String c1Name = new String("Child 1");
String c2Name = new String("Child 2");
String[] categoryArray = {p1Name, p2Name,c1Name,c2Name};
for (String s : categoryArray){
if(s.equals(p1Name) == true){
createNode(s, true, null, mainPanel);
}
if(s.equals(p2Name) == true){
createNode(s, true, null, mainPanel);
}
if(s.equals(c1Name) == true){
createNode(s, false, "Parent 1", mainPanel);
}
if(s.equals(c2Name) == true){
createNode(s, false, "Parent 2", mainPanel);
}
}
/*
* DefaultMutableTreeNode p1, p2;
p1 = treePanel.addObject(null, p1Name);
p2 = treePanel.addObject(null, p2Name);
treePanel.addObject(p1, c1Name);
treePanel.addObject(p1, c2Name);
treePanel.addObject(p2, c1Name);
treePanel.addObject(p2, c2Name);
*/
}
public void createNode(String categoryName, boolean isParent, String parent,
JPanel mainPanel){
DefaultMutableTreeNode categoryNode;
if(isParent == true){
categoryNode = treePanel.addObject(null, categoryName);
}else{
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) treePanel.tree.getModel().getRoot();
TreePath path = treePanel.find(rootNode, parent);
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) path.getLastPathComponent();
categoryNode = treePanel.addObject(parentNode, categoryName);
}
}
}
有什么想法可以從JTreeHelper中的偵聽器更改ThumbPanel中的卡嗎?
檢查返回的內容
parentNode.toString()
試試吧
tp.cl.show(tp, parentNode.getUserObject().toString());
問題已經解決,我將所有代碼都放在一個類中,現在可以正常工作了。 我不知道為什么當我在三個不同的類中擁有代碼時為什么不能更改卡。
現在看起來很糟糕,但是它正在運行,我可以繼續進行我的項目。
謝謝大家的時間。
最好的問候MK
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.