Java:同一个类中有多个ActionListener?

Java:同一个类中有多个ActionListener?,java,swing,actionlistener,Java,Swing,Actionlistener,我目前正在为我的软件工程课程模拟股票市场。我正在使用actionlistener为我当前的每个菜单项打开新窗口。然而,似乎每个类只能使用一个ActionListener,因此我只能为所有菜单选项设置一个窗口。有没有其他方法来实现多个动作侦听器?还有别的办法吗 这是我的密码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.Beve

我目前正在为我的软件工程课程模拟股票市场。我正在使用actionlistener为我当前的每个菜单项打开新窗口。然而,似乎每个类只能使用一个ActionListener,因此我只能为所有菜单选项设置一个窗口。有没有其他方法来实现多个动作侦听器?还有别的办法吗

这是我的密码:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.BevelBorder;
    import javax.swing.table.DefaultTableModel;

    public class GUIroughdraft implements Runnable, ActionListener
    {
          private JFrame frame;
          private JMenuBar menuBar;
          private JMenu FileMenu;
          private JMenu ActionMenu;
          private JMenu HelpMenu;
          private JMenuItem SaveMenuItem;
          private JMenuItem LoadMenuItem;
          private JMenuItem ExitMenuItem;
          private JMenuItem BuyMenuItem;
          private JMenuItem SellMenuItem;
          private JMenuItem AboutMenuItem;
          private JMenuItem UserManualMenuItem;


          public static void main(String[] args)
          {
            // needed on mac os x
            System.setProperty("apple.laf.useScreenMenuBar", "true");

            // the proper way to show a jframe (invokeLater)
            SwingUtilities.invokeLater(new GUIroughdraft());
          }


        private JFrame frmBgszStockSimulator;
        /**
         * @wbp.nonvisual location=53,14
         */
        //private final JLabel lblBgszStockSimulator =                 DefaultComponentFactory.getInstance().createTitle("BGSZ Stock Simulator");
        private JTextField searchBar;
        private JTable table;

        /**
         * Launch the application. Testing Comment
         */

        /*
        public static void main(String[] args) 
        {
            EventQueue.invokeLater(new Runnable() 
            {
                public void run() 
                {
                    try 
                    {
                        GUIroughdraft window = new GUIroughdraft();
                        window.frmBgszStockSimulator.setVisible(true);
                    } catch (Exception e) 
                    {
                e.printStackTrace();
                    }
                }
            });
        }
        */



        /**
         * Create the application.
         */
        /*
        public GUIroughdraft() 
        {
            run();
        }
        */

/**
 * Initialize the contents of the frame.
 */
public void run() 
{
    frmBgszStockSimulator = new JFrame("BGSZ Stock Simulator");
    frmBgszStockSimulator.getContentPane().setBackground(Color.GRAY);
    frmBgszStockSimulator.setTitle("BGSZ Stock Simulator");
    frmBgszStockSimulator.setBounds(100, 100, 775, 510);
    frmBgszStockSimulator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frmBgszStockSimulator.setVisible(true); 

    //Builds menu bar
    menuBar = new JMenuBar();

    //Builds the File menu
    FileMenu = new JMenu("File");
    SaveMenuItem = new JMenuItem("Save");
    LoadMenuItem = new JMenuItem("Load");
    ExitMenuItem = new JMenuItem("Exit");
    SaveMenuItem.addActionListener(this);
    LoadMenuItem.addActionListener(this);
    ExitMenuItem.addActionListener(this);
    FileMenu.add(SaveMenuItem);
    FileMenu.add(LoadMenuItem);
    FileMenu.add(ExitMenuItem);

    //Builds the Actions menu
    ActionMenu = new JMenu("Actions");
    BuyMenuItem = new JMenuItem("Buy");
    SellMenuItem = new JMenuItem("Sell");
    ActionMenu.add(BuyMenuItem);
    ActionMenu.add(SellMenuItem);

    //Builds the Help menu
    HelpMenu = new JMenu("Help");
    AboutMenuItem = new JMenuItem("About");
    UserManualMenuItem = new JMenuItem("User Manual");
    HelpMenu.add(AboutMenuItem);
    HelpMenu.add(UserManualMenuItem);

    menuBar.add(FileMenu);
    menuBar.add(ActionMenu);
    menuBar.add(HelpMenu);

    frmBgszStockSimulator.setJMenuBar(menuBar);


    JScrollBar scrollBar = new JScrollBar();
    scrollBar.setBackground(Color.LIGHT_GRAY);
    scrollBar.setBounds(323, 47, 21, 317);
    frmBgszStockSimulator.getContentPane().add(scrollBar);

    JTextArea displayBox = new JTextArea();
    displayBox.setEditable(false);
    displayBox.setLineWrap(true);
    displayBox.setWrapStyleWord(true);
    displayBox.setText("This will be a text field that displays all your actions and information about stocks, purchases, sales, errors, etc.");

    //when the user clicks the search button that is not there anymore 
    //create a new instance of the getStockData class
    //get the data from the input line something like  String userInput = searchBar.getText()
    //pass that to the getData(userInput);
    //set the displayBox.setText(the return from getData());

    displayBox.setBounds(12, 47, 312, 317);
    frmBgszStockSimulator.getContentPane().add(displayBox);

    searchBar = new JTextField();
    searchBar.setText("Enter your text here");
    searchBar.setBounds(12, 377, 733, 22);
    frmBgszStockSimulator.getContentPane().add(searchBar);
    searchBar.setColumns(10);

    JProgressBar progressBar = new JProgressBar();
    progressBar.setStringPainted(true);
    progressBar.setValue(75);
    progressBar.setBounds(78, 412, 586, 14);
    frmBgszStockSimulator.getContentPane().add(progressBar);

    table = new JTable();
    table.setModel(new DefaultTableModel(
            new Object[][] {
                {"Stock Name", "Stock Value", "Amount Owned", "Total Value"},
                {" BAC", "$13.48", "4", "$53.92"},
                {" RIG", "$8.89", "0", "$0.00"},
                {" SUNE", "$0.59", "12", "$7.08"},
                {" FCX", "$10.29", "2", "$20.58"},
                {" PBR", "$5.86", "0", "$0.00"},
                {" GE", "$31.83", "0", "$0.00"},
                {" VALE", "$4.24", "24", "$101.76"},
                {" VRX", "$27.07", "0", "$0.00"},
                {" PFE", "$30.07", "0", "$0.00"},
                {" CRC", "$1.05", "8", "$8.40"},
                {" GGB", "$1.82", "0", "$0.00"},
                {" CHK", "$4.01", "6", "$24.06"},
                {" T", "$39.37", "0", "$0.00"},
                {" F", "$13.35", "5", "$66.75"},
                {" WLL", "$7.66", "0", "$0.00"},
            },
            new String[] {
                "New column", "New column", "New column", "New column"
            }
        ));
    table.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
    table.setBounds(350, 51, 395, 313);
    frmBgszStockSimulator.getContentPane().add(table);

    JTextArea txtrValue = new JTextArea();
    txtrValue.setText("Displays Cash Value");
    txtrValue.setLineWrap(true);
    txtrValue.setEditable(false);
    txtrValue.setBounds(99, 12, 172, 22);
    frmBgszStockSimulator.getContentPane().add(txtrValue);

    JTextArea txtrCurrentPortfolioValue = new JTextArea();
    txtrCurrentPortfolioValue.setText("Display Portfolio Value");
    txtrCurrentPortfolioValue.setLineWrap(true);
    txtrCurrentPortfolioValue.setEditable(false);
    txtrCurrentPortfolioValue.setBounds(376, 12, 206, 22);
    frmBgszStockSimulator.getContentPane().add(txtrCurrentPortfolioValue);

    JLabel lblCashValue = new JLabel("Cash Value:");
    lblCashValue.setBounds(24, 15, 111, 16);
    frmBgszStockSimulator.getContentPane().add(lblCashValue);

    JLabel lblPortfolioValue = new JLabel("Portfolio Value:");
    lblPortfolioValue.setBounds(283, 15, 123, 16);
    frmBgszStockSimulator.getContentPane().add(lblPortfolioValue);

}

public void actionPerformed(ActionEvent ev)
  {
    SaveDialog dialog = new SaveDialog();
    dialog.setModal(true);
    dialog.setVisible(true);
  }


private class SaveDialog extends JDialog implements ActionListener
  {
    private JButton okButton = new JButton("Your File has been saved!");

    private SaveDialog()
    {
      super(frame, "Save", true);
      JPanel panel = new JPanel(new FlowLayout());
      panel.add(okButton);
      getContentPane().add(panel);
      okButton.addActionListener(this);
      setPreferredSize(new Dimension(250, 75));
      pack();
      setLocationRelativeTo(frame);
    }

    public void actionPerformed(ActionEvent ev)
    {
      setVisible(false);
    }
  }

public void actionPerformed2(ActionEvent ev)
  {
    LoadDialog dialog = new LoadDialog();
    dialog.setModal(true);
    dialog.setVisible(true);
  }

private class LoadDialog extends JDialog implements ActionListener
  {
    private JButton LoadButton = new JButton("Your File has successfully loaded!");

    private LoadDialog()
    {
      super(frame, "Load", true);
      JPanel panel = new JPanel(new FlowLayout());
      panel.add(LoadButton);
      getContentPane().add(panel);
      LoadButton.addActionListener(this);
      setPreferredSize(new Dimension(250, 75));
      pack();
      setLocationRelativeTo(frame);
    }

    public void actionPerformed(ActionEvent ev)
    {
      setVisible(false);
    }
  }


}

您不需要实现ActionListener接口,而是创建匿名类,为任何JButton或其他对象提供所需的不同功能。示例如下所示:

myButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // do whatever you want in here
            }

        });

在GUI草稿类中,将此代码放在actionPerformed方法中

public void actionPerformed(ActionEvent ev)
  {
    if(ev.getActionCommand().equalsIgnoreCase("Save"){
       SaveDialog dialog = new SaveDialog();
       dialog.setModal(true);
       dialog.setVisible(true);
     }
    else if(ev.getActionCommand().equalsIgnoreCase("Load")){
         LoadDialog dialog = new LoadDialog();
         dialog.setModal(true);
         dialog.setVisible(true);
     }
    else if(ev.getActionCommand().equalsIgnoreCase("Exit")){
        // Do whatever you like
     }

  }
而且根据编码标准,变量名应该以小写字母开头

私有JMenuItem SaveMenuItem---错


私有JMenuItem saveMenuItem---正确

是的,您只需简单地执行<代码>comp.addActionListener(新ActionListener(){public void actionPerformed(ActionEvent e){//put code here and stuff}})和用于替换多个窗口。您甚至可以使用
JDesktopPane
,有关更多信息,请参阅details@3kings如果我要做的是在动作侦听器中的JPane中创建窗口,该怎么办。我试过你说的去做,但没有成功。@AndrewThompson我修复了吊架的错误。我会试试看它是否有效,然后给你回复。谢谢你回答我的问题,非常感谢。对不起,我已经有一段时间没有用Java编写代码了。我会尝试一下,然后再给你回复。感谢您的帮助,我尝试使用您提供的代码,但是,即使单击菜单栏上的“加载”菜单项,我仍然会看到相同的“保存”对话框。我是如何在代码中定义某些内容的?是否可能是我的某个方法导致了此冲突?好的,在actionPerformed方法System.out.println(ev.getActionCommand())中添加这一行作为第一条语句;单击“保存”时应打印“保存”,单击“加载”时应打印“加载”。