2013-01-17 20 views
1

我很困惑,我见过的很多示例只处理一个按钮侦听器被传递。我希望能够通过全部将视图类(JFrame)的组件添加到Controller类中,以便轻松访问这些组件的侦听器。我怎样才能轻松做到这一点。这是我迄今为止所做的与JMenuItem,但在JFrame中我有更多的按钮,不想每次在构造函数中重复。在JFrame中传递组件列表的ActionListener

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"); 
    } 


    } 

//类查看

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){} 
     } 


    } 

回答

2

添加的方法是这样的:

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

构建单个EventController实例。

EventController controller = new EventController(); 

然后,把它为每个按钮:

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

如果不只是一个JButton,但菜单项,复选框等的混合参数是否更换的JButton用什么成分? – Hoody

+0

不,用AbstractButton替换,请参阅我编辑的答案。 –

+0

:D谢谢,重复setListener()在所有按钮的View类的构造函数中,menuitems(有6)是一个不好的做法? 也想知道如何将视图类初始化的控制权传递给Controller类,所以我避免在那里写入sql语句,有什么想法? – Hoody

2

创建监听器实例只是一次,重复使用。像这样

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