簡體   English   中英

如何將參數傳遞給/重寫ActionPerformed()

[英]How do I pass arguments to/override ActionPerformed()

這是下面的代碼。 我在具有三個菜單的面板中創建了一個菜單欄,第一個是“添加信息”。 在添加信息中,我添加了三個菜單項:員工,商品和客戶。 單擊適當的菜單項后,表單應出現在包含菜單欄的原始面板下方的另一個面板中。 此表單應根據單擊哪個Menuitem來輸入“員工”,“商品”或“客戶”的信息。 填寫表單后,有一個提交按鈕(在表單內),單擊該按鈕應創建一個新窗口/彈出窗口/對話框,該窗口應打印在表單中輸入的詳細信息。 我的問題從第幾行開始。 216行號 225.當我單擊“客戶”菜單項的“ submit3”按鈕時,彈出窗口出現,但未顯示包含“ txt1”內容的字符串的內容。 如何將組件的值傳遞給actionPerformed,以便它可以在新的彈出窗口中打印它們?

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class Retail extends JFrame implements ActionListener 
{
/**
 * 
 */
private static final long serialVersionUID = 1L;
JMenuBar menuBar = new JMenuBar();
JMenu addmenu = new JMenu("Add Information");
JMenu delmenu = new JMenu("Delete Information");
JMenu savemenu = new JMenu("Save Information");
JMenuItem emp = new JMenuItem("Employee");
JMenuItem merc = new JMenuItem("Merchandise");
JMenuItem cust = new JMenuItem("Customer");
Container contentPane = getContentPane();
JPanel p2 = new JPanel();

public Retail()
{
    super();
    contentPane.setLayout(new BorderLayout());
    JPanel p1 = new JPanel();
    p1.setBorder(new TitledBorder("Select Menu"));
    p1.setPreferredSize(new Dimension(500, 100));
    contentPane.add(p1,BorderLayout.NORTH);

    p2.setBorder(new TitledBorder("Entry Screen"));
    p2.setPreferredSize(new Dimension(500,500));    
    contentPane.add(p2,BorderLayout.CENTER);
    p2.setLayout(new BorderLayout());

    p1.add(menuBar);
    menuBar.add(addmenu);
    menuBar.add(delmenu);
    menuBar.add(savemenu);
    addmenu.add(emp);
    addmenu.addSeparator();
    addmenu.add(merc);
    addmenu.addSeparator();
    addmenu.add(cust);
    addmenu.addSeparator();


    emp.addActionListener(this);
    merc.addActionListener(this);
    cust.addActionListener(this);

}
public void actionPerformed(ActionEvent e)
{
    JButton submit1 = new JButton("Submit Employee Information"); 
    JButton submit2 = new JButton("Submit Merchandise Information");
    JButton submit3 = new JButton("Submit Customer Information");
    if(e.getSource() == emp)
    {   
        p2.removeAll();
        p2.updateUI();
        String[] states={"MA","AZ","CA"};
        JLabel lb1 = new JLabel("First Name:");
        JTextField txt1 = new JTextField(12);
        JLabel lb2 = new JLabel("Last Name:");
        JTextField txt2 = new JTextField(12);
        JLabel lb3 = new JLabel("Address:");
        JTextField txt3 = new JTextField(12);
        JLabel lb4 = new JLabel("City:");
        JTextField txt4 = new JTextField(12);
        JLabel lb5 = new JLabel("State");
        JComboBox cb1 = new JComboBox(states);
        JLabel lb6 = new JLabel("ZipCode");
        JTextField txt5 = new JTextField(12);
        JPanel p3 = new JPanel();
        p3.setLayout(new GridLayout(8,1));
        JPanel p4 = new JPanel();
        p4.setLayout(new GridLayout(1,2));
        JLabel lb7= new JLabel("Gender:");
        JRadioButton rb1 = new JRadioButton("Male");
        JRadioButton rb2 = new JRadioButton("Female");
        ButtonGroup bgroup = new ButtonGroup();
        bgroup.add(rb1);
        bgroup.add(rb2);
        JLabel lb8 = new JLabel("Submit Information:");
        JPanel p5 = new JPanel();
        p5.setLayout(new GridLayout(8,1));
        p3.add(lb1);
        p3.add(lb2);
        p3.add(lb3);
        p3.add(lb4);
        p3.add(lb5);
        p3.add(lb6);
        p3.add(lb7);
        p3.add(lb8);

        p5.add(txt1);
        p5.add(txt2);
        p5.add(txt3);
        p5.add(txt4);
        p4.add(rb1);
        p4.add(rb2);
        p5.add(cb1);
        p5.add(txt5);
        p5.add(p4);
        p5.add(submit1);

        p2.add(p3,BorderLayout.WEST);
        p2.add(p5,BorderLayout.EAST);

        submit1.addActionListener(this);
    }

    if(e.getSource() == merc)
    {
        p2.removeAll();
        p2.updateUI();
        String[] states={"MA","AZ","CA"};
        JLabel lb1 = new JLabel("First Name:");
        JTextField txt1 = new JTextField(12);
        JLabel lb2 = new JLabel("Last Name:");
        JTextField txt2 = new JTextField(12);
        JLabel lb3 = new JLabel("Address:");
        JTextField txt3 = new JTextField(12);
        JLabel lb4 = new JLabel("City:");
        JTextField txt4 = new JTextField(12);
        JLabel lb5 = new JLabel("State");
        JComboBox cb1 = new JComboBox(states);
        JLabel lb6 = new JLabel("ZipCode");
        JTextField txt5 = new JTextField(12);
        JPanel p3 = new JPanel();
        p3.setLayout(new GridLayout(8,1));
        JPanel p4 = new JPanel();
        p4.setLayout(new GridLayout(1,2));
        JLabel lb7= new JLabel("Gender");
        JRadioButton rb1 = new JRadioButton("Male");
        JRadioButton rb2 = new JRadioButton("Female");
        JLabel lb8 = new JLabel("Submit Information:");

        JPanel p5 = new JPanel();
        p5.setLayout(new GridLayout(8,1));
        p3.add(lb1);
        p3.add(lb2);
        p3.add(lb3);
        p3.add(lb4);
        p3.add(lb5);
        p3.add(lb6);
        p3.add(lb7);
        p3.add(lb8);
        p5.add(txt1);
        p5.add(txt2);
        p5.add(txt3);
        p5.add(txt4);
        p4.add(rb1);
        p4.add(rb2);
        p5.add(cb1);
        p5.add(txt5);
        p5.add(p4);
        p5.add(submit2);

        p2.add(p3,BorderLayout.WEST);
        p2.add(p5,BorderLayout.EAST);

        submit2.addActionListener(this);

    }
    if(e.getSource() == cust)
    {
        p2.removeAll();
        p2.updateUI();
        String[] states={"MA","AZ","CA"};
        JLabel lb1 = new JLabel("First Name:");
        JTextField txt1 = new JTextField(12);
        JLabel lb2 = new JLabel("Last Name:");
        JTextField txt2 = new JTextField(12);
        JLabel lb3 = new JLabel("Address:");
        JTextField txt3 = new JTextField(12);
        JLabel lb4 = new JLabel("City:");
        JTextField txt4 = new JTextField(12);
        JLabel lb5 = new JLabel("State");
        JComboBox cb1 = new JComboBox(states);
        JLabel lb6 = new JLabel("ZipCode");
        JTextField txt5 = new JTextField(12);
        JPanel p3 = new JPanel();
        p3.setLayout(new GridLayout(8,1));
        JPanel p4 = new JPanel();
        p4.setLayout(new GridLayout(1,2));
        JLabel lb7= new JLabel("Gender");
        JRadioButton rb1 = new JRadioButton("Male");
        JRadioButton rb2 = new JRadioButton("Female");
        JLabel lb8 = new JLabel("Submit Information:");
        JPanel p5 = new JPanel();
        p5.setLayout(new GridLayout(8,1));
        p3.add(lb1);
        p3.add(lb2);
        p3.add(lb3);
        p3.add(lb4);
        p3.add(lb5);
        p3.add(lb6);
        p3.add(lb7);
        p3.add(lb8);

        p5.add(txt1);
        p5.add(txt2);
        p5.add(txt3);
        p5.add(txt4);
        p4.add(rb1);
        p4.add(rb2);
        p5.add(cb1);
        p5.add(txt5);
        p5.add(p4);
        p5.add(submit3);

        p2.add(p3,BorderLayout.WEST);
        p2.add(p5,BorderLayout.EAST);
        final String s;
        s = txt1.getText();
        submit3.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent args0) 
            {
                JOptionPane.showMessageDialog(rootPane,s);
            }
        });
    }
}
public static void main(String[] args)
{

    Retail frame = new Retail();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Retail Information");
    frame.pack();
    frame.setResizable(true);
    frame.setVisible(true);
}


}

您的代碼有幾個問題,但是問題的根源是創建String的時間。 創建它是在創建要顯示的JPanel時創建的,而不是在按下提交按鈕時創建的。 一種快速的權宜之計是將您的JTextFields定為最終文本,然后提交JButton的ActionListener中從其中提取文本。

例如,

  if (e.getSource() == cust) {
     p2.removeAll();
     p2.updateUI();
     String[] states = { "MA", "AZ", "CA" };
     JLabel lb1 = new JLabel("First Name:");
     final JTextField txt1 = new JTextField("Foo", 12);

     // ....

     // final String s;
     // s = txt1.getText();
     submit3.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent args0) {
           String s = txt1.getText();
           JOptionPane.showMessageDialog(rootPane, s);
        }
     });
  }

話雖如此,如果這是我的代碼,我將使用更好的總體計划進行重新設計。

建議包括:

  • 將此大類細分為邏輯子類。
  • 使用CardLayout交換視圖。
  • 加少許MVC或M odel- V iew- 呼叫控制結構,以從GUI分離出的程序邏輯。
  • 使用有意義的變量名,以便我的代碼可以自我注釋。 例如,我將JTextField firstNameField命名為txt1或類似名稱。
  • 對我的每個JButton使用AbstractActions,而不是一個巨大的ActionListener以便所有人共享。

也許您可以將JTextField txt1實例變量,這意味着您將其放在類范圍變量中,而不是將JTextField txt1放在actionPerformedMethod內,您可以像這樣移動聲明:

public class Retail extends JFrame implements ActionListener 
{
private JTextField txt1 = new JTextField(12);

現在您可以像這樣引用txt1

submit3.addActionListener(new ActionListener() 
{
@Override
public void actionPerformed(ActionEvent args0) 
{
String text = Retail.this.txt1.getText();
JOptionPane.showMessageDialog(rootPane,s);
}
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM