做了一个带菜单的多panel界面panel用cardlayout,通过菜单切换(removeall(),add())现在想通过panel上的button做到面板切换,好像实现不了,所以想到这个笨办法

解决方案 »

  1.   

    这么白痴的问题啊,直接在
    public void actionPerformed(ActionEvent e)
    {
      if(e.getSource()==菜单对象||e.getSource()==按钮对象)
    {
    ........
    }
    }
    如果不想判断的话也可以内部类的形式,可以在菜单项和按钮里重写一下原代码。
    谢谢 分拿来。
    该问题已结帖~!
      

  2.   

    楼上这位口气这么牛啊~
    呵呵~他只说对了一个方面
    楼主只要写在同一个类型的事件里就可以了
    actionPerformed的话就
    public void ButtonactionPerformed(ActionEvent e)
    {MenuactionPerformed(e);}如果是MouseClicked的话就
    public void ButtonMouseClicked(ActionEvent e)
    {MenuMouseClicked(e);}
    就可以了,不知道LZ明白我的意思吗?
      

  3.   

    个人认为if(e.getSource()==菜单对象||e.getSource()==按钮对象)
    这类方法绝对不可取,原因有二:
    1、菜单对象,按钮对象可能根本不是定义的全局变量,
    再说一个Component如果没有特殊用途,也没什么必要定义全局的;
    2、如果还有一个JComboBox的响应事件也要响应该方法,
    是不是又得在代码中添加if(e.getSource()==JComboBox对象)?内部类就更不可取了,特别是在网页中应用时,每个内部类的下载都要建立一个新的网络连接(java默认模式),这样会大大降低运行速度。
      

  4.   

    不知道是我的表达不太好,还是水平有限看不太懂..我的意思就是,菜单上的按钮添加了动态调用各种Panel的功能我是想让panel上的button在完成他应该完成的功能后,直接调用菜单上的某个MenuItem,其实就是类似返回主界面的功能(因为这个界面由一个默认panel和各种功能panel构成,我希望某个panel完成功能后返回默认panel,不知道正确的做法是什么,所以只能想出这么个折中办法)  if(e.getSource()==菜单对象||e.getSource()==按钮对象)这个语句是不是当按下按钮或者按下菜单后都执行此事件?那应该和我的想法不同吧?  楼主只要写在同一个类型的事件里就可以了
      actionPerformed的话就
      public void ButtonactionPerformed(ActionEvent e)
      {MenuactionPerformed(e);}这个是调用菜单事件?如何确定具体调用哪个菜单事件?还有就是这个方法怎么API里头没有?不好意思,菜鸟一个,还望指点...
      

  5.   

    这样可不可以添加一个背景Panel,常驻添加一个功能容器,透明,上面放置功能面板不过我试了下,添加在功能容器上的面板不可见..
      

  6.   

    //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"菜单项?
            }
        }
    }代码有点长,希望能有人指点迷津-.-
      

  7.   

    我倒认为wangwenjin() 的办法是可取的,只不过不要采用if(e.getSource()==菜单对象||e.getSource()==按钮对象)这样的形式,而是if (e.getActionCommand().equals("somecommand"))思路是一样的。假如如果还有一个JComboBox的响应事件也要响应该方法,也只需要将此JComboBox的ActionCommand设置为"somecommand"就OK
      

  8.   

    那段代码只是想表达我的意思..
    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"菜单项?
            }
        }
    }
      

  9.   

    其实大家给你的答案都是正确的,但是从代码看来楼主对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,建议推倒重来。
      

  10.   

    这句也是改后的
    改前:public StartPanel() {
    改后:public StartPanel(ActionListener al) {
      

  11.   

    public void actionPerformed(ActionEvent e)
    {}
      

  12.   

    public void actionPerformed(ActionEvent e)
    {
    //先获得你想调用的JMenuItem、然后调用其doClick()方法
    javax.swing.JMenuItem menuitem=...;
    menuitem.doClick();
    }