2015-10-30 98 views
5

在我的计划,我希望用户:如何避免嵌套的ActionListeners?

  1. 拾取/打开数据库(如Access)对自己
  2. 从表中选择一个表从数据库
  3. 选择列(S)

在我的代码,我有一个类,做这样的事情:

mntmOpenDatabase.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     //open the database 
     //display tables as buttons 
     tableButton.addActionListener(new ActionListener() { // select a table 
      public void actionPerformed(ActionEvent e) { 
       //display the columns of the table selected as buttons 
        colButton.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent e) {// add to the list of columns to be exported } 

这导致了一个非常大的代码块。有没有更干净,更简单的方法来做到这一点?

+2

[如何使用操作(HTTP://文档。 oracle.com/javase/tutorial/uiswing/misc/action.html) – MadProgrammer

回答

10

的解决方案是重构:

  • 用于代码打开数据库创建一个单独的,并分别可测试的类。
  • 以及一个单独的可单独测试的类来显示这些数据。
  • 在ActionListener中,创建这些类的实例,或者与它们交互(如果它们已经存在)。
  • 了解M-V-C(模型 - 视图 - 控制)设计模式的基本原理,并使用它们。你不必对他们冷淡,主人知道有很多变种,但他们的总体指导原则至少应该受到尊重。
  • 尽力让您的GUI或视图为哑尽可能。它知道如何显示其数据,它具有允许控件更新其显示的功能,并且知道如何在用户与之交互时通知控件,这就是它。
  • 建议1:确保所有数据库交互都在后台线程中完成。
  • 方面建议2:确保几乎所有的Swing交互都在Swing EDT(事件派发线程)上完成。

请看这个相似但更完整的问题和答案:How can one best avoid writing bloated GUI code?。答案是一样的好,我希望我可以投票给他们数十亿次。

例如,你上面的代码可能是简单的:

mntmOpenDatabase.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     control.openDatabase(); 
    } 
} 
+0

所以我终于做了一些有关MVC的研究。我想我有种基本的想法,但是我仍然想知道,我应该在哪里放置ActionListeners?在控制器或视图内?对此似乎有不同的看法。 – PuggyLongLegs

+1

@ForeverLearning:这是因为两者都可以正常工作。在我看来,如果ActionListeners在视图中,那么它们非常简单,他们所做的就是调用一个等效的控制方法,就像我上面展示的那样。否则,你可以让控制注入动作到视图中。 –

+0

听起来不错。我想我会尝试。但是,创建一个包含所有动作侦听器的Action类,或者将它们全部放在同一个类中,并且这些组件是好的,是不是一个好主意? – PuggyLongLegs

1

在你的榜样,您将实例化和每个动作事件添加新的监听器。真的,你应该配置一次。事情是这样的:

public class OpenDataBaseListener implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
       //your event handling here 
     } 
} 

public class TableButtonListener implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      //your logic 
     } 
} 

等等

当你创建你的听众,你应该注册一次他们:

mntmOpenDatabase.addActionListener(new OpenDataBaseListener()); 
tableButton.addActionListener(new TableButtonListener()); 
colButton.addActionListener(new ColButtonListener());