如何在不同类的Swing组件之间进行交互?

时间:2013-11-25 23:00:02

标签: java swing jcombobox jtabbedpane interaction

我有一个包含许多组件的复杂GUI(JButtons,JLabels,JComboBoxes,JSpinners等)。这就是为什么我必须将它分成几个类(将组件添加到JPanels,这个JPanels添加到更大的JPanels,这个JPanels添加到JTabbedPane,JTabbedPane添加到JFrame)。 取决于用户选择和填充数据一些组件启用或禁用或获得一些值并设置不可编辑(一句话 - 交互)。它很容易完成并正常工作,如果组件(它们是交互的)在同一个类中,但如果它只在不同的类中 - 任何结果...... AAA !!!

我做了一个简单的例子来解释我需要什么。有四个班。首先创建JFrame并添加JTabbedPane:

public class MainFrame extends JFrame {

MainFrame() {
    super("MainFrame");
    go();
}

public void go() {
    Tabs tabs = new Tabs();
    getContentPane().add(tabs);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 300);
    setVisible(true);
}

public static void main(String[] args) {
    MainFrame frame = new MainFrame();
}

}

第二个类创建JTabbedPane并添加两个JPanel作为选项卡。第二个tab.setEnabledAt(1,false):

public class Tabs extends JTabbedPane {

public Tabs() {
    go();
}

public void go() {
    TabData data = new TabData();
    add("  Data  ", data);
    TabCalculation calculation = new TabCalculation();
    add("Calculation", calculation);
    setEnabledAt(1, false);
}

}

第三个类使用JComboBox创建JPanel:

public class TabData extends JPanel {

public TabData() {
    go();
}

JComboBox someData; 

public void go() {      
    String type[] = { "    ", "Type 1", "Type 2", "Type 3" };
    someData = new JComboBox(type);
    add(someData);
    someData.addActionListener(new DataListener());
}

public class DataListener implements ActionListener {

    public void actionPerformed(ActionEvent ev) {           
        if (someData.getSelectedIndex() > 0) {
            Tabs tabs = new Tabs();
            tabs.setEnabledAt(1, true);
        }
    }
}

}

...和第四类创建一些JPanel。禁用此JPanel的第二个选项卡。当用户在JComboBox中设置一些值(selectedIndex> 0)时 - 必须启用选项卡。但Tabs tabs = new Tabs(); tabs.setEnabledAt(1, true);没有帮助......

我该怎么做?请帮忙!!!我无法入睡......我无法工作......我一直在思考它,并试图寻找解决方案......

1 个答案:

答案 0 :(得分:1)

  

当用户在JComboBox中设置一些值时(selectedIndex> 0) - 选项卡必须   启用。

如果您需要拆分所有这些课程,那么我建议您在第3课中进行此更改:

public class TabData extends JPanel {

    JComboBox someData;

    ...

    // Get rid of DataListener class and add this public method instead:
    public void addActionListenerToComboBox(ActionListener listener) {
        someData.addActionListener(listener);
    }
}

在你的第二堂课中做出改变:

public class Tabs extends JTabbedPane {

    public Tabs() {
        go();
    }

    public void go() {
        TabData data = new TabData();           
        data.addActionListenerToComboBox(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox comboBox = (JComboBox)e.getSource();
                boolean enableSecondTab = comboBox.getSelectedIndex() > -1;
                setEnabledAt(1, enableSecondTab);
            }

        });
        add("  Data  ", data);
        TabCalculation calculation = new TabCalculation();
        add("Calculation", calculation);
        setEnabledAt(1, false);
    }
}

查看EventObject.getSource() javadoc了解更多详情。