将侦听器添加到JPanel

时间:2016-05-20 19:27:00

标签: java jpanel listener

我有一个自定义类CustomField,它扩展了JPanel。由于我经常需要重用相同的模式,我的自定义类由2个JLabel和2个JComboBox组成。 这很简单;第一个JComboBox有ON / OFF选项,第二个JComboBox只有在第一个设置为“ON”时才可见。我可以管理这部分。 我不知道设计好的部分是CustomField实例在另一个主JFrame类中,在这个JFrame中,只有当CustomField类中的JComboBox设置为“ON”时,某些部分才可见。 ”。我想过使用MouseAdapter,但我不知道这是一个好习惯。

这是我的CustomField类:

public class Main {
    CustomField cf = new CustomField("test", "ON, "Test2");
    public static void main(String s[]) {

        JFrame frame = new JFrame("Application");

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());


        panel.add(cf);

        JLabel labelTest = new JLabel("Label that should be visible or not");
        panel.add(labelTest);

        frame.add(panel);
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

这是主要的JFrame:

import pandas as pd
s = pd.Series(['A', 'B', 'C', 'D'])
len_combination = 5

基本上,我希望labelTest可根据CustomField设置进行更改。按照它的方式,我不能将labelTest放在CustomField类中。

有没有干净的方法来做我想要的?我应该重新设计实际的东西并将所有字段放在同一个类中吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,您希望使用CustomField中的方法公开组合框的状态:

public boolean isOn() {
    return testCB.getSelectedIndex() == 1;
}

通过查看使用标准JavaBean侦听器模式的各种Swing组件的文档中的方法签名,您可以了解如何监听状态:您将要添加三个公共方法,一个受保护方法:

public void addChangeListener(ChangeListener listener) {
    listenerList.add(ChangeListener.class, listener);
}

public void removeChangeListener(ChangeListener listener) {
    listenerList.remove(ChangeListener.class, listener);
}

public ChangeListener[] getChangeListeners() {
    return listenerList.getListeners(ChangeListener.class);
}

protected void fireChangeListeners() {
    ChangeEvent event = new ChangeEvent(this);
    for (ChangeListener listener : getChangeListeners()) {
        listener.stateChanged(event);
    }
}

(listenerList字段继承自JComponent。)

现在,只要您检测到用户更改了On / Off组合框的值,您就可以简单地添加对fireChangeListeners();的调用 - 也就是说,您需要在ItemListener中调用它。

正如您可能猜到的那样,您的Main类现在可以调用cf.addChangeListener,并且该侦听器内部会根据cf.isOn()返回的值调整标签的可见性。

通过阅读these,您可以了解更多信息。