我想有程序里动态的加载JMenu、JMenuItem和JButton,目的是不同的用户对应不同的功能菜单。
之前发贴有朋友告诉用XML文件来记录数据信息,但遇到了难题,每个被触发的事件那又怎样来处理呢?请朋友们帮帮忙,想了好几天都没有一个好的解决方法,想看看别人是怎样来完善的处理的,谢谢大家!!!

解决方案 »

  1.   

    在触发事件里对JPanel重新构造,并添加需要的按扭、菜单,之后使其显示出来。这样我没做过,应该可以,我是用触发事件对菜单、按扭的SetEnable()方法操作来屏蔽相关功能的 ^_^
      

  2.   

    其实很简单的,如果你开始学JAVA时不用可视化就没这问题了。
    所有的控件都是类。去实例化你需要的每一个控件。再去设置控件的属性,有些可以在构造函数里完成。去看构造函数。有些常用的属性我也不说了,我也不去记看了就知道。
    窗体上通常加一个JPanel,如果你不用可视化得自己写。所有容器控件都有Add()方法。控件常用的属性:位置,文本,大小。看你现在最需要的是Swing的API。有问题去思考两小时,就算想不出来你也有很大收获。时间久了,你就拥有了编程的思想。
      

  3.   

    楼上的可能都没看清楚.我说的是button、menu和menuItem都是动态加载入去的,程序里没有什么JButton jButton = new JButton()之类的,所有信息都是添加在外部文件里,现在就是说触发的事件就知道怎样来处理。例如:我想添加一个Button,只要在配置文件里添加这个BUTTON的有关属性就行了,不必是程序里添加,但问题想这个新添中的Button应该触发什么事件呢?这里想不到解决的方法。
    楼上说:有问题去思考两小时。哎,头大了,不只两个小时了请大伙帮帮忙。
      

  4.   

    试试新建一个继承JButton的类,在这个类里把触发事件写上,在需要调用这个JButton的程序里动态加载它
      

  5.   

    看一下我的代码就知道,主要是用匿名类处理。computeTable是我代码中一个组件,有点乱,可以仔细看看。
    computeTable.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e)){
    JPopupMenu menu = new JPopupMenu();
    JMenuItem addItem = new JMenuItem("Add");
    menu.add(addItem);
    addItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {

    computeModel.addRow(new Object[]{""});

    }

    });
    JMenuItem moveItem = new JMenuItem("Move");
    menu.add(moveItem);
    moveItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {

    computeModel.removeRow(computeTable.getSelectedRow());

    if (computeTable.getRowCount() < 1){

       computeModel.addRow(new Object[]{""});
       
    }

    }

    });
    menu.show(computeTable,e.getX(),e.getY());
    }

    }
         });
        }
      

  6.   

    整理了一下:
    computeTable.addMouseListener(new MouseAdapter(){
        public void mouseClicked(MouseEvent e) {
             //判断是否是双击
    if (SwingUtilities.isRightMouseButton(e)){
        JPopupMenu menu = new JPopupMenu();
    JMenuItem addItem = new JMenuItem("Add");
    menu.add(addItem);
                    //添加事件处理
    addItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    computeModel.addRow(new Object[]{""});
    }
    });
                    //动态加添加快捷菜单
    JMenuItem moveItem = new JMenuItem("Move");
    menu.add(moveItem);
                    //添加事件处理
    moveItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    computeModel.removeRow(computeTable.getSelectedRow());
    if (computeTable.getRowCount() < 1){
       computeModel.addRow(new Object[]{""});
    }
    }
    });
    menu.show(computeTable,e.getX(),e.getY());
    }
            }
         });
      

  7.   

    需要的监听器事先都写好,反正都是类,写了不初始化也不费系统资源。
    每个button和对应的监听器间的关系也写到配置文件里,到时候动态加载控件的时候把监听器也同时初始化了与按钮联系起来。这不就可以监听按钮的事件了。一个思路,你可以试试。
      

  8.   

    我的GUI 配置文件  希望对你有帮助
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE commands SYSTEM "commands.dtd">
    <commands version="1.1.0">
        <group id="menu.main">
          <face>
             <text>Main Menu</text>
          </face>
          <members>
             <member command-id="menu.file"/>
             <expansion-point/>
             <glue/>
             <member command-id="menu.help"/>
          </members>
       </group>
      <group id="main.toolbar">
          <face name="toobar">
             <text>GUI Commands Toolbar</text>
          </face>
         <members>
     <!-- <member command-id="menu.help.about"/>
      <member command-id="menu.help.about"/>
      <member command-id="menu.help.about"/>
         <member command-id="menu.help.about"/> 
           <member command-id="page.selectors" inline="true" />
            <expansion-point separator="after"/>-->
          </members>
       </group>
       <group id="menu.file">
          <face>
             <text mnemonic="f">File</text>
          </face>
          <members>
             <member command-id="menu.file.connect"/>
             <expansion-point separator="after"/>
             <member command-id="menu.file.exit"/>
          </members>
       </group>
         
       
       <group id="menu.help">
          <face>
             <text mnemonic="h">Help</text>
          </face>
          <members>
          <expansion-point separator="after"/>
             <member command-id="menu.help.about"/>
          </members>
       </group>
     
       <group id="page.selectors">
          <face>
             <text mnemonic="p">Pages</text>
          </face>
          <members>
    <!--         <expansion-point/>-->
          </members>
       </group>   <command id="menu.file.exit">
          <face>
             <text mnemonic="x">Exit</text>
             <description>Close and exit the demo</description>
              <accelerator key="F4">
                <modifier value="alt"/>
             </accelerator>
          </face>
       </command>
      
       <command id="menu.help.about">
          <class>org.york.chat.ui.command.AboutCommand</class>
          <face>
             <text mnemonic="a">About</text>
             <!--<icon type="classpath">org/york/ui/resources/copy.gif</icon>-->
             <accelerator key="F1"/>
          </face>
       </command>
       <command id="menu.file.connect">
          <class>org.york.chat.ui.command.ConnectCommand</class>
          <face>
             <text mnemonic="a">connect</text>
             <!--<icon type="classpath">org/york/ui/resources/copy.gif</icon>-->
             <accelerator key="F2"/>
          </face>
       </command>
      
       
    </commands>
      

  9.   

    我做过这样的,其实很简单,
    构造MENU,在把他加入FRAME中,你一般是通过可视界面创建,觉得很难,其实很容易的