请问有没有可能设置JPanel上的JButton去"触发"菜单上的某个MeunItem的事件? 做了一个带菜单的多panel界面panel用cardlayout,通过菜单切换(removeall(),add())现在想通过panel上的button做到面板切换,好像实现不了,所以想到这个笨办法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这么白痴的问题啊,直接在public void actionPerformed(ActionEvent e){ if(e.getSource()==菜单对象||e.getSource()==按钮对象){........}}如果不想判断的话也可以内部类的形式,可以在菜单项和按钮里重写一下原代码。谢谢 分拿来。该问题已结帖~! 楼上这位口气这么牛啊~呵呵~他只说对了一个方面楼主只要写在同一个类型的事件里就可以了actionPerformed的话就public void ButtonactionPerformed(ActionEvent e){MenuactionPerformed(e);}如果是MouseClicked的话就public void ButtonMouseClicked(ActionEvent e){MenuMouseClicked(e);}就可以了,不知道LZ明白我的意思吗? 个人认为if(e.getSource()==菜单对象||e.getSource()==按钮对象)这类方法绝对不可取,原因有二:1、菜单对象,按钮对象可能根本不是定义的全局变量,再说一个Component如果没有特殊用途,也没什么必要定义全局的;2、如果还有一个JComboBox的响应事件也要响应该方法,是不是又得在代码中添加if(e.getSource()==JComboBox对象)?内部类就更不可取了,特别是在网页中应用时,每个内部类的下载都要建立一个新的网络连接(java默认模式),这样会大大降低运行速度。 不知道是我的表达不太好,还是水平有限看不太懂..我的意思就是,菜单上的按钮添加了动态调用各种Panel的功能我是想让panel上的button在完成他应该完成的功能后,直接调用菜单上的某个MenuItem,其实就是类似返回主界面的功能(因为这个界面由一个默认panel和各种功能panel构成,我希望某个panel完成功能后返回默认panel,不知道正确的做法是什么,所以只能想出这么个折中办法) if(e.getSource()==菜单对象||e.getSource()==按钮对象)这个语句是不是当按下按钮或者按下菜单后都执行此事件?那应该和我的想法不同吧? 楼主只要写在同一个类型的事件里就可以了 actionPerformed的话就 public void ButtonactionPerformed(ActionEvent e) {MenuactionPerformed(e);}这个是调用菜单事件?如何确定具体调用哪个菜单事件?还有就是这个方法怎么API里头没有?不好意思,菜鸟一个,还望指点... 这样可不可以添加一个背景Panel,常驻添加一个功能容器,透明,上面放置功能面板不过我试了下,添加在功能容器上的面板不可见.. //MainFrame.java//主界面框架import java.awt.*;import java.awt.event.*;import javax.swing.*;public class NetBarFrame extends JFrame{ private JPanel mainJPanel = new JPanel();//卡片容器 private JMenuBar jMenuBar = new JMenuBar(); private JMenu jMenu1 = new JMenu("常规"), private JMenuItem startItem = new JMenuItem("登陆"), endItem = new JMenuItem("注销"); class ShowStartPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ mainJPanel.removeAll(); mainJPanel.add("start",new StartPanel()); mainJPanel.validate(); } } class ShowEndPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ mainJPanel.removeAll(); mainJPanel.add("end",new EndPanel()); mainJPanel.validate(); } } class ShowDefaultPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ mainJPanel.removeAll(); mainJPanel.add("start",new DefaultPanel()); mainJPanel.validate(); } } public NetBarFrame(){ this.setLayout(new BorderLayout()); this.setSize(400,300); this.setLocation(250, 250); this.setResizable(false); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); this.setJMenuBar(jMenuBar); mainJPanel.setLayout(new CardLayout()); mainJPanel.add("default",new DefaultPanel()); //默认面板 defaultItem.addActionListener(new ShowDefaultPanel()); //登陆 startItem.addActionListener(new ShowStartPanel()); //注销 endItem .addActionListener(new ShowEndPanel()); jMenu1.add(startItem); jMenu1.add(endItem); jMenu1.add(defaultItem); jMenuBar.add(jMenu1); jMenuBar.add(jMenu2); this.add(mainJPanel); this.setVisible(true); } public static void main(String[] args) { NetBarFrame frame = new NetBarFrame(); frame.setVisible(true); }}//StartPanel.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.text.*;public class StartPanel extends JPanel { private JButton btn1 = new JButton("确定"), public StartPanel() { setLayout(null); btn1.setBounds(new Rectangle(109, 208, 81, 26)); btn1.addActionListener(new OpenCard()); add(btn1); } class OpenCard implements ActionListener { public void actionPerformed(ActionEvent e) { //完成功能 //如何调用"defaultItem"菜单项? } }}代码有点长,希望能有人指点迷津-.- 我倒认为wangwenjin() 的办法是可取的,只不过不要采用if(e.getSource()==菜单对象||e.getSource()==按钮对象)这样的形式,而是if (e.getActionCommand().equals("somecommand"))思路是一样的。假如如果还有一个JComboBox的响应事件也要响应该方法,也只需要将此JComboBox的ActionCommand设置为"somecommand"就OK 那段代码只是想表达我的意思..JDK1.5//MainFrame.java//主界面框架import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MainFrame extends JFrame{ private JPanel mainJPanel = new JPanel();//卡片容器 private JMenuBar jMenuBar = new JMenuBar(); private JMenu jMenu1 = new JMenu("测试"); private JMenuItem startItem = new JMenuItem("登陆"), defaultItem = new JMenuItem("返回"); class ShowStartPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ mainJPanel.removeAll(); mainJPanel.add("start",new StartPanel()); mainJPanel.validate(); } } class ShowDefaultPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ mainJPanel.removeAll(); mainJPanel.add("Default",new DefaultPanel()); mainJPanel.validate(); } } public MainFrame(){ this.setLayout(new BorderLayout()); this.setSize(400,300); this.setLocation(250, 250); this.setResizable(false); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); this.setJMenuBar(jMenuBar); mainJPanel.setLayout(new CardLayout()); mainJPanel.add("default",new DefaultPanel()); //默认面板 defaultItem.addActionListener(new ShowDefaultPanel()); //登陆 startItem.addActionListener(new ShowStartPanel()); jMenu1.add(startItem); jMenu1.add(defaultItem); jMenuBar.add(jMenu1); this.getContentPane().add(mainJPanel); this.setVisible(true); } public static void main(String[] args) { MainFrame frame = new MainFrame(); frame.setVisible(true); }}//DefaultPanel.java//默认面板import java.awt.*;import javax.swing.*;public class DefaultPanel extends JPanel { JLabel lab1 = new JLabel(); public DefaultPanel() { setLayout(null); lab1.setBounds(new Rectangle(72, 48, 253, 31)); lab1.setText("默认面板"); lab1.setFont(new Font("宋体",Font.BOLD,20)); lab1.setForeground(Color.red); add(lab1); }}//StartPanel.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;public class StartPanel extends JPanel { private JButton btn1 = new JButton("确定"); public StartPanel() { setLayout(null); btn1.setBounds(new Rectangle(109, 208, 81, 26)); btn1.addActionListener(new OpenCard()); add(btn1); } class OpenCard implements ActionListener { public void actionPerformed(ActionEvent e) { //完成功能 //如何调用"defaultItem"菜单项? } }} 其实大家给你的答案都是正确的,但是从代码看来楼主对Swing的事件处理模式完全不明白。LZ的意思就是让某个JButton做某个JMenuItem一样的事情嘛,要让上面的代码工作非常容易,让JButton和JMenuItem共享同一个(或是使用相同的)ActionLisener即可。对上面的代码些许改动:......class ShowStartPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ mainJPanel.removeAll(); // mainJPanel.add("start", new StartPanel())); 改动前的代码 mainJPanel.add("start",new StartPanel(new ShowDefaultPanel())); // 改动后的代码 mainJPanel.validate(); }}......public class StartPanel extends JPanel { private JButton btn1 = new JButton("OK"); public StartPanel(ActionListener al) { setLayout(null); btn1.setBounds(new Rectangle(109, 208, 81, 26)); //btn1.addActionListener(new OpenCard()); 改动前的代码 btn1.addActionListener(al); //改动后的代码 add(btn1); } // 以下代码完全没用/* class OpenCard implements ActionListener { public void actionPerformed(ActionEvent e) { 完成功能 如何调用"defaultItem"菜单项? } }*/虽然改动后可以运行,但是整个程式码非常地bad smeel,建议推倒重来。 这句也是改后的改前:public StartPanel() {改后:public StartPanel(ActionListener al) { public void actionPerformed(ActionEvent e){} public void actionPerformed(ActionEvent e){//先获得你想调用的JMenuItem、然后调用其doClick()方法javax.swing.JMenuItem menuitem=...;menuitem.doClick();} 发现一个好的界面程序,与大家共分享 B 和 C java.util.Calendar 抽象类中方法怎么有方法体啊 如何将加密后字符串转换成 对应的数字字符串(不影响解密) 谁有jDK6.0.exe文件 电脑出了点问题 下载不了 各位高手过来看看这是用什么加密算法加密的. 求电子版<<jbuilder实用技术手册>> 和<<java事务处理>>. 哪位高人能提供eclipse使用的电子书 新手请教关于import? 幾個簡單的細節問題,請幫幫忙了,急啊 !!!!!! EBNF语言 一个四则运算 关于打开url文件的问题,请高手指教--------急
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==菜单对象||e.getSource()==按钮对象)
{
........
}
}
如果不想判断的话也可以内部类的形式,可以在菜单项和按钮里重写一下原代码。
谢谢 分拿来。
该问题已结帖~!
呵呵~他只说对了一个方面
楼主只要写在同一个类型的事件里就可以了
actionPerformed的话就
public void ButtonactionPerformed(ActionEvent e)
{MenuactionPerformed(e);}如果是MouseClicked的话就
public void ButtonMouseClicked(ActionEvent e)
{MenuMouseClicked(e);}
就可以了,不知道LZ明白我的意思吗?
这类方法绝对不可取,原因有二:
1、菜单对象,按钮对象可能根本不是定义的全局变量,
再说一个Component如果没有特殊用途,也没什么必要定义全局的;
2、如果还有一个JComboBox的响应事件也要响应该方法,
是不是又得在代码中添加if(e.getSource()==JComboBox对象)?内部类就更不可取了,特别是在网页中应用时,每个内部类的下载都要建立一个新的网络连接(java默认模式),这样会大大降低运行速度。
actionPerformed的话就
public void ButtonactionPerformed(ActionEvent e)
{MenuactionPerformed(e);}这个是调用菜单事件?如何确定具体调用哪个菜单事件?还有就是这个方法怎么API里头没有?不好意思,菜鸟一个,还望指点...
//主界面框架import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class NetBarFrame extends JFrame{
private JPanel mainJPanel = new JPanel();//卡片容器
private JMenuBar jMenuBar = new JMenuBar();
private JMenu jMenu1 = new JMenu("常规"),
private JMenuItem
startItem = new JMenuItem("登陆"),
endItem = new JMenuItem("注销"); class ShowStartPanel implements ActionListener{
public void actionPerformed(ActionEvent e){
mainJPanel.removeAll();
mainJPanel.add("start",new StartPanel());
mainJPanel.validate();
}
}
class ShowEndPanel implements ActionListener{
public void actionPerformed(ActionEvent e){
mainJPanel.removeAll();
mainJPanel.add("end",new EndPanel());
mainJPanel.validate();
}
}
class ShowDefaultPanel implements ActionListener{
public void actionPerformed(ActionEvent e){
mainJPanel.removeAll();
mainJPanel.add("start",new DefaultPanel());
mainJPanel.validate();
}
}
public NetBarFrame(){
this.setLayout(new BorderLayout());
this.setSize(400,300);
this.setLocation(250, 250);
this.setResizable(false);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setJMenuBar(jMenuBar);
mainJPanel.setLayout(new CardLayout());
mainJPanel.add("default",new DefaultPanel());
//默认面板
defaultItem.addActionListener(new ShowDefaultPanel());
//登陆
startItem.addActionListener(new ShowStartPanel());
//注销
endItem .addActionListener(new ShowEndPanel());
jMenu1.add(startItem);
jMenu1.add(endItem);
jMenu1.add(defaultItem); jMenuBar.add(jMenu1);
jMenuBar.add(jMenu2);
this.add(mainJPanel);
this.setVisible(true);
}
public static void main(String[] args) {
NetBarFrame frame = new NetBarFrame();
frame.setVisible(true);
}
}
//StartPanel.javaimport java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.text.*;public class StartPanel extends JPanel {
private JButton
btn1 = new JButton("确定"),
public StartPanel() {
setLayout(null);
btn1.setBounds(new Rectangle(109, 208, 81, 26));
btn1.addActionListener(new OpenCard());
add(btn1);
}
class OpenCard implements ActionListener {
public void actionPerformed(ActionEvent e) {
//完成功能
//如何调用"defaultItem"菜单项?
}
}
}代码有点长,希望能有人指点迷津-.-
JDK1.5
//MainFrame.java
//主界面框架import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class MainFrame extends JFrame{
private JPanel mainJPanel = new JPanel();//卡片容器
private JMenuBar jMenuBar = new JMenuBar();
private JMenu jMenu1 = new JMenu("测试");
private JMenuItem
startItem = new JMenuItem("登陆"),
defaultItem = new JMenuItem("返回");
class ShowStartPanel implements ActionListener{
public void actionPerformed(ActionEvent e){
mainJPanel.removeAll();
mainJPanel.add("start",new StartPanel());
mainJPanel.validate();
}
}
class ShowDefaultPanel implements ActionListener{
public void actionPerformed(ActionEvent e){
mainJPanel.removeAll();
mainJPanel.add("Default",new DefaultPanel());
mainJPanel.validate();
}
} public MainFrame(){
this.setLayout(new BorderLayout());
this.setSize(400,300);
this.setLocation(250, 250);
this.setResizable(false);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setJMenuBar(jMenuBar);
mainJPanel.setLayout(new CardLayout());
mainJPanel.add("default",new DefaultPanel());
//默认面板
defaultItem.addActionListener(new ShowDefaultPanel());
//登陆
startItem.addActionListener(new ShowStartPanel());
jMenu1.add(startItem);
jMenu1.add(defaultItem); jMenuBar.add(jMenu1);
this.getContentPane().add(mainJPanel);
this.setVisible(true);
}
public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
}//DefaultPanel.java
//默认面板
import java.awt.*;
import javax.swing.*;public class DefaultPanel extends JPanel {
JLabel lab1 = new JLabel();
public DefaultPanel() {
setLayout(null);
lab1.setBounds(new Rectangle(72, 48, 253, 31));
lab1.setText("默认面板");
lab1.setFont(new Font("宋体",Font.BOLD,20));
lab1.setForeground(Color.red);
add(lab1);
}
}
//StartPanel.javaimport java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class StartPanel extends JPanel {
private JButton
btn1 = new JButton("确定");
public StartPanel() {
setLayout(null);
btn1.setBounds(new Rectangle(109, 208, 81, 26));
btn1.addActionListener(new OpenCard());
add(btn1);
}
class OpenCard implements ActionListener {
public void actionPerformed(ActionEvent e) {
//完成功能
//如何调用"defaultItem"菜单项?
}
}
}
要让上面的代码工作非常容易,让JButton和JMenuItem共享同一个(或是使用相同的)ActionLisener即可。
对上面的代码些许改动:
......
class ShowStartPanel implements ActionListener{
public void actionPerformed(ActionEvent e){
mainJPanel.removeAll();
// mainJPanel.add("start", new StartPanel())); 改动前的代码
mainJPanel.add("start",new StartPanel(new ShowDefaultPanel())); // 改动后的代码
mainJPanel.validate();
}
}
......
public class StartPanel extends JPanel {
private JButton btn1 = new JButton("OK");
public StartPanel(ActionListener al) {
setLayout(null);
btn1.setBounds(new Rectangle(109, 208, 81, 26));
//btn1.addActionListener(new OpenCard()); 改动前的代码
btn1.addActionListener(al); //改动后的代码
add(btn1);
}
// 以下代码完全没用
/* class OpenCard implements ActionListener {
public void actionPerformed(ActionEvent e) {
完成功能
如何调用"defaultItem"菜单项?
}
}*/虽然改动后可以运行,但是整个程式码非常地bad smeel,建议推倒重来。
改前:public StartPanel() {
改后:public StartPanel(ActionListener al) {
{}
{
//先获得你想调用的JMenuItem、然后调用其doClick()方法
javax.swing.JMenuItem menuitem=...;
menuitem.doClick();
}