1

为什么我不能firePropertyChange()this引用时调用?

    [javac] /home/thufir/NetBeansProjects/Legacy/src/legacy/gui/table/SelectTableFollowup.java:41: error: cannot find symbol
    [javac]                     this.firePropertyChange("client", null, i);
    [javac]                         ^
    [javac]   symbol: method firePropertyChange(String,<null>,int)
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] 1 error
    [javac] 1 warning

BUILD FAILED
/home/thufir/NetBeansProjects/Legacy/nbproject/build-impl.xml:923: The following error occurred while executing this line:
/home/thufir/NetBeansProjects/Legacy/nbproject/build-impl.xml:263: Compile failed; see the compiler error output for details.

Total time: 4 seconds
thufir@dur:~/NetBeansProjects/Legacy$ 

这是我的代码:

package legacy.gui.table;

import java.awt.BorderLayout;
import java.util.logging.Logger;
import javax.swing.JPanel;
import legacy.database.Queries;

public class SelectTableFollowup extends JPanel {

    private static final Logger log = Logger.getLogger(SelectTableFollowup.class.getName());
    private ClientsTable table;
    private Followup followup;
    private Select Select;
    private final Queries queries = new Queries();

    public SelectTableFollowup() {
        initComponents();
    }

    private void initComponents() {
        table = new ClientsTable();
        followup = new Followup();
        Select = new Select();
        setLayout(new BorderLayout());
        add(Select, BorderLayout.NORTH);
        add(table, BorderLayout.CENTER);
        add(followup, BorderLayout.SOUTH);
        followupButton();
        query();
        cannotFirePropertyChangeOnThisObj();
    }

    private void cannotFirePropertyChangeOnThisObj() {
        table.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            @Override
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                if ("client".equals(evt.getPropertyName())) {
                    String s = evt.getNewValue().toString();
                    int i = Integer.parseInt(s);
                    log.info("i is " + i);
                    this.firePropertyChange("client", null, i);
                }
            }

        });
    }

    private void followupButton() {
        followup.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            @Override
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                if ("followup".equals(evt.getPropertyName())) {
                    try {
                        int id = table.getId();
                        queries.send(id);
                        table.updateModel();
                    } catch (ArrayIndexOutOfBoundsException obe) {
                        log.info(obe.toString());  //no big deal
                    }
                }
            }
        });
    }

    private void query() {
        Select.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            @Override
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                if ("select".equals(evt.getPropertyName())) {
                    log.info(evt.getNewValue().toString());
                    table.select(evt.getNewValue().toString());
                }
            }
        });
    }
}

从 Netbeans,我知道调用NetBeans 创建的this.firePropertyChange(),是很可能的。JPanel

上述类与 Netbeans 生成的类有何不同?两者都扩展了相同的基类。

如果我滥用了任何术语,请告诉我。

4

2 回答 2

5

在这种情况下:

table.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
    @Override
    public void propertyChange(java.beans.PropertyChangeEvent evt) {
        ...
        this.firePropertyChange("client", null, i);
    }
}

关键字this是指创建新实例时生成的匿名内部类。PropertyChangeListener此处解释了这一事实:使用 this 关键字

看看这个主题:来自匿名内部类的外部类的关键字?您应该将此行替换为该行以引用您的面板类:

table.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
    @Override
    public void propertyChange(java.beans.PropertyChangeEvent evt) {
        ...
        SelectTableFollowup.this.firePropertyChange("client", null, i);
    }
}

或者您可以删除this,编译器将为您解决相同的问题:

table.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
    @Override
    public void propertyChange(java.beans.PropertyChangeEvent evt) {
        ...
        firePropertyChange("client", null, i);
    }
}

鉴于匿名内部类没有任何firePropertyChange()方法,编译器将查找外部类(或最终层次结构树)并检查它是否有这样的方法,确实如此。

于 2014-08-21T11:32:31.907 回答
4

我认为错误发生在这种方法中:

private void cannotFirePropertyChangeOnThisObj() {
    table.addPropertyChangeListener(new java.beans.PropertyChangeListener() 

        @Override
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            if ("client".equals(evt.getPropertyName())) {
                String s = evt.getNewValue().toString();
                int i = Integer.parseInt(s);
                log.info("i is " + i);
                this.firePropertyChange("client", null, i);
            }
        }

    });
}

您正在调用firePropertyChange()匿名PropertyChangeListener对象。文档声明它没有声明方法firePropertyChange()

我想你想在你的SelectTableFollowup对象上调用它。然后你必须这样称呼它:

private void cannotFirePropertyChangeOnThisObj() {
    table.addPropertyChangeListener(new java.beans.PropertyChangeListener() 

        @Override
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            if ("client".equals(evt.getPropertyName())) {
                String s = evt.getNewValue().toString();
                int i = Integer.parseInt(s);
                log.info("i is " + i);
                SelectTableFollowup.this.firePropertyChange("client", null, i); // Reference this of the outer class
            }
        }

    });
}

由于PropertyChangeListener没有声明方法,你也可以只写firePropertyChange("client", null, i);.

于 2014-08-21T11:30:35.043 回答