简体   繁体   中英

Passing ActionListener of a List of components in a JFrame

I am very confused, many examples I have seen only deal with one button listener being passed. I want to be able to pass ALL Components of a View Class (JFrame) to the Controller Class which will have easy access to the listeners of those components. How Can I do this easily. This is what I've done so far with JMenuItem , but in the JFrame i have more buttons, dont want to repeat in the Constructor every time.

 public class EventController implements ActionListener {
    private EventModel model;
    private EventView view;



    public EventController(){
        model = new EventModel(); 

    }


    @Override
   public void actionPerformed(ActionEvent e) {
       if (e.getActionCommand().equals("add")) {
       JOptionPane.showMessageDialog(null, "add button clicked");
   }   else if (e.getActionCommand().equals("edit")) {
       JOptionPane.showMessageDialog(null, "edit button clicked");
   }   else if (e.getActionCommand().equals("delete")) {
       JOptionPane.showMessageDialog(null, "delete button clicked");
  }


    }   

//class View

  public class EventView extends javax.swing.JFrame {
Connection conn = JavaConnect.ConnectDB();
PreparedStatement pst = null; 
ResultSet rs = null; 


    public EventView() {
        initComponents();
        updateEventTable();
        addEvent.addActionListener(new EventController());
        addEvent.setActionCommand("add");
        editEvent.addActionListener(new EventController());
        editEvent.setActionCommand("edit");
        deleteEvent.addActionListener(new EventController());
        deleteEvent.setActionCommand("delete");
    }
    public void updateEventTable() {
        try {
            String sql = "SELECT date as 'Date',eventName as 'Name', time as 'Start Time' FROM Event";
             pst = conn.prepareStatement(sql); 
             rs = pst.executeQuery();
             tableEvent.setModel(DbUtils.resultSetToTableModel(rs));
             tableEvent.getColumnModel().getColumn(0).setPreferredWidth(80);
             tableEvent.getColumnModel().getColumn(1).setPreferredWidth(170);
             tableEvent.getColumnModel().getColumn(2).setPreferredWidth(110);  
    }
        catch (Exception e ) {
                     JOptionPane.showMessageDialog(null, e);
        } finally {
            try {
                rs.close(); pst.close();conn.close();;
            } catch(SQLException e){}
        }


    }

Create listener instance just once and reuse it. Like this

    EventController lst=new EventController();
    addEvent.addActionListener(lst);
    addEvent.setActionCommand("add");
    editEvent.addActionListener(lst);
    editEvent.setActionCommand("edit");
    deleteEvent.addActionListener(lst);
    deleteEvent.setActionCommand("delete");

Add a method like this:

private void setListener(AbstractButton button, ActionListener listener, String command) {
  button.addActionListener(listener);
  button.setActionCommand(command);
}

Build a single EventController instance.

EventController controller = new EventController();

Then, call it for each button:

setListener(addEvent, controller, "add");
...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM