在类中创建的多个选项卡(来自jtabbedpane)上执行一个操作

时间:2012-05-08 10:53:02

标签: java swing tabs

我创建了一个gui,这个gui使用了一个jtabbed窗格。我有一个数组,其中包含每个选项卡的名称。我用

for (String locale : langList){
    LocaleTab tab = new LocaleTab();
    tab.buildTab(locale);
    localeTabs.add(locale, tab.getTabPanel());
}

在我的主类中创建选项卡。在每个选项卡上,我有一个jtextarea和一个jtable以及两个按钮,一个用于在该特定选项卡上运行操作,另一个用于清除该区域设置的表和textarea中的内容。这非常有效。

我的问题是,我可以单独运行并清除每个选项卡上的所有内容,我无法弄清楚如何一次为所有选项卡执行此操作。我有一个主清除和运行按钮,按下该按钮将清除所有语言环境中的所有textarea和表数据,或立即在所有语言环境上运行操作。

我想我可以在动作监听器中为我的清除按钮执行以下操作:

for (String locale : langList){
    LocaleTab tab = new LocaleTab();
    tab.clearTab();
}

但它不起作用。我是否需要将对象选项卡传递给我的方法才能同时处理选项卡?

2 个答案:

答案 0 :(得分:4)

由于您在动作侦听器中创建了新的LocaleTab对象,因此建议的解决方案不起作用。因此,您将清除UI中不存在的LocaleTab个实例的选项卡(由于该变量的范围,一旦您离开该方法,该选项卡就不再存在)。

相反,您的侦听器应该可以访问您最初创建的LocaleTab个实例。

注意

看到这段代码的一点点评论。为什么要同时为所有支持的语言创建UI。最终用户通常使用一种语言的应用程序,那么为什么需要额外的UI。为什么不仅仅为适当的语言创建UI,从而绕过您当前面临的问题

答案 1 :(得分:3)

@Robin(+1)已经提到了您的代码无效的原因。

为了扩展@Robin的答案,我建议如下:

  1. 创建一个方法,将要清除的标签作为参数,将其命名为clearTabs(List<LocaleTab> tabs)
  2. 您可以存储对所有已创建标签的引用,例如在全局变量(列表)中,称为例如tabs
  3. 清除按钮上的动作侦听器应该在actionPerformed方法中调用清除方法,例如,如下所示。 (我建议您切换到使用Action而不是ActionListener)。

    Action clearAction = new AbstractAction("Clear Tabs"){
        @Override
        public void actionPerformed(ActionEvent e) {
            clearTabs(tabs);
        }
    };
    
  4. 修改 clearTabs方法的主体。

    void clearTabs(List<LocaleTab> tabs){
       for (LocaleTab tab: tabs)
          tab.clearTab();
    }