【问题标题】:Cannot invoke "this.firePropertyChange()" on JPanel reference无法在 JPanel 参考上调用“this.firePropertyChange()”
【发布时间】:2014-10-15 00:19:01
【问题描述】:

为什么我不能在 this 引用上调用 firePropertyChange()

    [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 创建的 JPanel 调用 this.firePropertyChange() 是完全可能的。

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

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

【问题讨论】:

    标签: java swing netbeans polymorphism matisse


    【解决方案1】:

    在这种情况下:

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

    关键字this 指的是在创建新的PropertyChangeListener 实例时生成的anonymous 内部类。这个事实在这里解释:Using the this Keyword

    看看这个话题:Keyword for the outer class from an anonymous inner class?你应该替换这一行来引用你的面板类:

    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);
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

      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);
                  }
              }
      
          });
      }
      

      您正在对匿名 PropertyChangeListener 对象调用 firePropertyChange()docs 声明它没有声明方法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);

      【讨论】:

        猜你喜欢
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多