作者snowlike (snowlike)
看板java
标题Re: [问题] 关於final
时间Tue Feb 23 14:02:53 2010
※ 引述《foxenangel (该来的还是跑不掉阿)》之铭言:
: final JLabel messageLabel=new JLabel("Nothing selected.");
: ^^^^^
: add(messageLabel, BorderLayout.SOUTH);
: tree.addTreeSelectionListener(new TreeSelectionListener() {
: public void valueChanged(TreeSelectionEvent e) {
: TreePath tp=e.getNewLeadSelectionPath();
: messageLabel.setText("Selected: "+tp.getLastPathComponent() );
: } ^^^^^^^^^^^^
: });
: 我查小蚂蚁他说final指定出不可修改的变数,我不了解的是为什麽我把final拿掉的话
: 会出现错误讯息:local variable messageLabel is accessed from within inner class
: ; needs to declared final
: 另外,我想请问addTreeSelectionListener那段里面的valueChanged这个类别可以拉出来
: 跟addTreeSelectionListener成同一个scope吗?不太懂为什麽一定要宣告这个类别
: 烦请指教,谢谢!
TreeSelectionListener参阅JSE's API是一个interface class
介面实作的方式基本是作
class TSL implemets TreeSelectionListener {
//标注这是做覆写不容易犯错字造成新函式
@Override
public void valueChanged(TreeSelectionEvent arg0) {
....
}
}
然後addTreeSelectionListener()加入实作过的介面这样子
所以可以如此写作addTreeSelectionListener(new TSL());
多个名称的话就是TSL tsl=new TSL();addTreeSelectionListener(tsl);
匿名的话可以少些设立的变数名称,简单的使用一个{}来实作内容
addTreeSelectionListener(new TreeSelectionListener() {
private int newValue //一样可以设立新变数
public void newFunction //或新函式
@Override
public void valueChanged(TreeSelectionEvent arg0) {
....
}
})
这是由於值改变的时候系统会调用valueChanged()所以才去override这个方法
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.33.184.50
1F:推 foxenangel:差点忘记listener是介面,看到inner class就头昏了 02/23 14:14
2F:推 foxenangel:那为什麽原本的程式码中不用加上implement? 02/23 14:17
3F:→ snowlike:不使用新变数,implements没有主词就不用,所以才称匿名 02/23 14:25
4F:推 foxenangel:所以valueChanged是匿名的方法? 02/23 14:26
5F:→ snowlike:也可以这麽说..像是newFunction的部份就没办法由外部调用 02/23 14:30
6F:推 foxenangel:上了一课!! 终於搞懂了 谢谢!! 02/23 14:31