如何将操作执行分配给特定操作侦听器



我正在尝试制作一些最终的聊天室代码。现在,我正在研究 GUI 组件,并试图让自己熟悉 ActionListeners 并让事情发生!不幸的是,我似乎遇到了障碍。

我的操作侦听器都自动跳转到相同的"操作已执行"。我不确定如何为我添加的每个操作侦听器创建唯一的操作执行。

请您解释一下我如何采取我的:

// ADD ACTION LISTENERS TO COMPONENTS
I1.addActionListener(this);         // INPUT    
B1.addActionListener(this);         // SEND BUTTON

并为不同的代码段进行单独的 addActionListener 赋值。毕竟我不能让他们都使用它!

public void actionPerformed(ActionEvent e){
if(I1.getText() != null){
   A1.append(" USERNAME " + ": " + I1.getText() + n);
   I1.setText("");
   }
}

问题

我不知道如何为每个 ActionListener 分配唯一的 actionPerforming 命令。我添加的任何侦听器都使用默认的 actionPerform,当我想为每个侦听器使用唯一的侦听器时。

溶液

每个动作都可以像这样与监听器一起挤进去!

    // ***          ADD ACTION LISTENERS TO COMPONENTS
    // INPUT | TEXT AREA
    I1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            A1.append(" USERNAME " + ": " + I1.getText() + n);
            I1.setText("");
        }
    });     
    // INPUT | SENT BUTTON
    B1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            A1.append(" USERNAME " + ": " + I1.getText() + n);
            I1.setText("");
        }
    });

完整代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI_ScreenWindow extends JFrame implements ActionListener{
// DECLARATIONS : TEXT AND USER INPUTS
private final static String n = "n";
// DECLARATIONS : APPEARENCE
private JPanel PN = new JPanel();                   // NORTH PANEL  | MENU BAR
private JPanel PS = new JPanel();                   // SOUTH PANEL  | TEXT INPUT
private JPanel PS1 = new JPanel();                  // SOUTH PANEL  | SEND
private JPanel PC = new JPanel();                   // CENTER PANEL | TEXT AREA
private JTextField I1 = new JTextField(45);         // INPUT
private JTextArea A1 = new JTextArea(25, 51);       // DISPLAY
private JButton B1 = new JButton("SEND");           // SEND
// DECLARATION : MENU BARS
private JMenuBar MENU = new JMenuBar();
private JMenu file = new JMenu("FILE");                             // MENU: FILE
private JMenu display = new JMenu("DISPLAY");                       // MENU: DISPLAY
private JMenuItem S = new JMenuItem("Save", KeyEvent.VK_N);         // ITEM | FILE | SAVE
private JMenuItem C = new JMenuItem("Clear", KeyEvent.VK_N);        // ITEM | FILE | CLEAR
private JMenuItem D = new JMenuItem("Disconnect", KeyEvent.VK_N);   // ITEM | FILE | DISCONNECT
private JMenuItem red = new JMenuItem("Red", KeyEvent.VK_N);        // ITEM | EDIT | RED
private JMenuItem d = new JMenuItem("Default", KeyEvent.VK_N);      // ITEM | EDIT | DEFAULT
public GUI_ScreenWindow(){
    super("J&G CHATROOM");
    // LAYOUT POSITION/TYPE
    setLayout(new BorderLayout());
    PN.setLayout(new GridLayout());
    PS1.setLayout(new BorderLayout());
    PS.setLayout(new BorderLayout());
    PC.setLayout(new FlowLayout());
    // BUILD THE MENU BAR
    file.setMnemonic(KeyEvent.VK_F);
    MENU.add(file);
    display.setMnemonic(KeyEvent.VK_F);
    MENU.add(display);
    //                  FILE
    file.add(S);        // SAVE
    file.add(C);        // CLEAR CHAT
    file.add(D);        // DISCONNECT FROM SERVER
    //                  DISPLAY COLOR
    display.add(d);     // DEFAULT
    display.add(red);   // RED
    // EDIT TEXT AREA
    JScrollPane A1scroll = new JScrollPane(A1);
    A1scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    A1scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    A1.setEditable(false);
    A1.setLineWrap(true);
    A1.setWrapStyleWord(true);
    // ADD COMPONENTS TO THE FRAME
    add("North", PN);
    add("Center", PC);
    add("South", PS);
    PC.add(A1scroll);
    PS.add("East", PS1);
    PS.add(I1);
    PS1.add(B1);
    PN.add(MENU);
    // ADD ACTION LISTENERS TO COMPONENTS
    I1.addActionListener(this);         // INPUT    
    B1.addActionListener(this);         // SEND BUTTON
}
public void actionPerformed(ActionEvent e){
    if(I1.getText() != null){
        A1.append(" USERNAME " + ": " + I1.getText() + n);
        I1.setText("");
    }
}}

解决方案 1:

您可以获取事件的来源,如下所示: e.getSource()并比较 I1 和 B1。它会是这样的:

if(e.getSource() == aButton){
    //do something
}

解决方案 2:

使用匿名类:

button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    //do whatever you want here 
    } 
});

最新更新