2012-10-25 91 views
2

我正在编码MVC。在我的控制器中,我正在监听该动作,如果用户单击“显示列表”按钮,我正在制作一个从JFrame扩展视图类的实例,并在其中创建一个新的JFrame。我的问题是,如果我多次点击SHOW-LIST按钮,我会打开多次框架。谁能告诉我我怎么可以这样做,因此,一旦一个新的框架即将开启旧框框关闭..如何在打开新框架时关闭前一个框架

控制器

public void actionPerformed(ActionEvent event) { 
    String viewAction = event.getActionCommand(); 
    ... 
    if (viewAction.equals("SHOW-LIST")) { 
     showListUI = new ShowListDialogUI(displayedCustomerList); 
    } 
} 

查看

class ShowListDialogUI extends JFrame{ 
    public ShowListDialogUI (List<Customer> customerList) { 
    .. 
    // I am drawing it here 
    .. 
    } 
} 
+2

参见[*多JFrames的用途,好/ Bad Practice?*](http://stackoverflow.com/q/9554636/230513) – trashgod

回答

3

有人能告诉我怎样才能做到这一点,这样一旦一个新的帧 即将开启旧框框关闭..

  • 使用CardLayout,那么没有理由玩Top-Level Container s,放在那里需要的号码JPanels,然后只是在JPanel视图之间切换

  • @trashgod通知,还真没好主意,办法

  • 否则必须清理(删除所有内容)uselless容器,because Top-Level Containers never will be GC'ed

+0

+1一如既往的好建议 –

1

嘛,要看用例,但不是关闭旧的,而是创建新的,你可以集中现有的(可能更新数据?)。

您的控制器可以管理这些帧并对其进行跟踪。在最简单的(不推荐)方式中,你有一个布尔型的“isFrameOpen”。如果打开框架,则将其设置为true;如果关闭框架,则将其设置为false(您的框架必须与控制器通信,或者控制器必须至少知道框架的状态)。如果布尔值为true,则重点/重新创建它。如果为false,则创建一个新的。

在更高级的解决方案中,您可以使用地图跟踪所有帧,并且您必须认真处理并发访问。

--tb

+0

你提出的想法很好,但是为什么当'JFrame'本身从'Window'获得这个方法时使用布尔变量类,称为[isShowing()](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#isShowing())。 +1的想法,但不是你应用的技术:-) –

+0

@GagandeepBali我完全同意,这就是我写道“(而不是推荐)”的原因:)这是为了容易理解。 –

相关问题