java applet 多个按钮_Java JApplet:按钮树问题

此小程序应采用存储在menuTree中的树,并基于该树进行菜单构建.

currentNode存储小程序当前所在的菜单,并且其每个子级都应显示为按钮.

单击按钮后,小程序将带您进入一个新菜单,代表单击的按钮.

我无法让按钮在单击另一个按钮时发生变化.

我不确定这棵树是否正确构建,因为它不是特别容易测试.

任何帮助将不胜感激.

谢谢.

import javax.swing.*;

import javax.swing.tree.*;

import java.awt.event.*;

import java.awt.*;

public class Menu extends JApplet implements ActionListener{

private static final long serialVersionUID = 2142470002L;

private JTree menuTree;

private DefaultMutableTreeNode currentNode;

private JPanel buttonPanel;

public void init(){

this.setSize(700, 550);

buttonPanel=new JPanel();

buttonPanel.setSize(300, 500);

this.add(buttonPanel);

/**

* will make node out of the first entry in the array, then make nodes out of subsequent entries

* and make them child nodes of the first one. The process is repeated recursively for entries that are arrays.

* this idea of tree declaration as well as the code from the method was lovingly

* stolen from: http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html

*/

Object [] menuNames = { "ROOT",

new Object[] { "Classic Chess",

new Object[] { "Game",

"AI",

"Hotseat",

"Online"

},

"Challenges",

new Object[]{ "Practice",

"Situations",

"Coaching"

},

},

new Object[] { "Fairy Chess",

new Object[] { "Game",

"AI",

"Hotseat",

"Online"

},

"Challenges",

new Object[]{ "Practice",

"Situations",

"Coaching"

},

"Create Pieces"

}

};

currentNode=processHierarchy(menuNames);

menuTree = new JTree(currentNode);

initializeButtons(currentNode);

}

/**

* Clicking one of the buttons(which should be in the children of the currentNode), takes you to that node in the tree

* setting currentNode to that node and redoing buttons to represent its children.

*/

public void actionPerformed(ActionEvent ae){

Button b=(Button)ae.getSource();

for(int i =0; i

if(b.getLabel().equals(currentNode.getChildAt(i)+"")){

currentNode=(DefaultMutableTreeNode)currentNode.getChildAt(i);

initializeButtons(currentNode);

}

}

}

/**

* will make node out of the first entry in the array, then make nodes out of subsequent entries

* and make them child nodes of the first one. The process is repeated recursively for entries that are arrays.

* this idea of tree declaration as well as the code from the method was lovingly

* stolen from: http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html

*/

private DefaultMutableTreeNode processHierarchy(Object[] hierarchy) {

DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]);

DefaultMutableTreeNode child;

for (int i = 1; i < hierarchy.length; i++) {

Object nodeSpecifier = hierarchy[i];

if (nodeSpecifier instanceof Object[]) // Ie node with children

child = processHierarchy((Object[]) nodeSpecifier);

else

child = new DefaultMutableTreeNode(nodeSpecifier); // Ie Leaf

node.add(child);

}

return (node);

}

/**

* creates buttons for each child of the given node, labels them with their String value, and adds them to the panel.

*/

private void initializeButtons(DefaultMutableTreeNode node){

Button b;

buttonPanel.removeAll();

for(int i =0; i

b=new Button();

b.setLabel(""+node.getChildAt(i));

buttonPanel.add(b);

}

}

}

解决方法:

遵循@Andrew的有用概述,TreeSelectionListener似乎很合适.有关详细信息,请参见How to Use Trees.应用程序似乎更容易调试.使用revalidate()是更新修订版式的关键.

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Container;

import java.awt.EventQueue;

import java.awt.GridLayout;

import javax.swing.JApplet;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTree;

import javax.swing.event.TreeSelectionEvent;

import javax.swing.event.TreeSelectionListener;

import javax.swing.tree.DefaultMutableTreeNode;

/** @see https://stackoverflow.com/questions/7342713 */

public class Menu extends JApplet {

private JTree menuTree;

private JPanel buttonPanel;

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

JFrame frame = new JFrame();

frame.setTitle("Menu");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

new Menu().initContainer(frame);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

@Override

public void init() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

initContainer(Menu.this);

}

});

}

private void initContainer(Container container) {

container.setLayout(new GridLayout(1, 0));

buttonPanel = new JPanel(new GridLayout(0, 1));

Object[] menuNames = {"ROOT",

new Object[]{"Classic Chess",

new Object[]{"Game", "AI", "Hotseat", "Online"},

"Challenges",

new Object[]{"Practice", "Situations", "Coaching"}

},

new Object[]{"Fairy Chess",

new Object[]{"Game", "AI", "Hotseat", "Online"},

"Challenges",

new Object[]{"Practice", "Situations", "Coaching"},

"Create Pieces"

}

};

DefaultMutableTreeNode currentNode = processHierarchy(menuNames);

menuTree = new JTree(currentNode);

menuTree.setVisibleRowCount(10);

menuTree.expandRow(2);

initializeButtons(currentNode);

container.add(buttonPanel, BorderLayout.WEST);

container.add(new JScrollPane(menuTree), BorderLayout.EAST);

menuTree.addTreeSelectionListener(new TreeSelectionListener() {

@Override

public void valueChanged(TreeSelectionEvent e) {

initializeButtons((DefaultMutableTreeNode)

menuTree.getLastSelectedPathComponent());

}

});

}

private DefaultMutableTreeNode processHierarchy(Object[] hierarchy) {

DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]);

DefaultMutableTreeNode child;

for (int i = 1; i < hierarchy.length; i++) {

Object nodeSpecifier = hierarchy[i];

if (nodeSpecifier instanceof Object[]) {

child = processHierarchy((Object[]) nodeSpecifier);

} else {

child = new DefaultMutableTreeNode(nodeSpecifier);

}

node.add(child);

}

return (node);

}

private void initializeButtons(DefaultMutableTreeNode node) {

Button b;

buttonPanel.removeAll();

for (int i = 0; i < node.getChildCount(); i++) {

b = new Button();

b.setLabel("" + node.getChildAt(i));

buttonPanel.add(b);

buttonPanel.revalidate();

}

}

}

标签:jtree,japplet,button,swing,java

来源: https://codeday.me/bug/20191208/2087856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值