2010-08-10 54 views
1

爲什麼不能在的JLabel的Java Swing或在上面的程序,爲什麼我必須把此行的「私人內部類像JMenu的JMenuBar的爲什麼不能JLabel的是一個內部類聲明

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class Chk extends JFrame 
{ 

private JLabel lbl ; 

public Chk() 
{ 

lbl = new JLabel("StatusBar"); 
lbl.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); 
add(lbl,BorderLayout.SOUTH); 


JMenuBar menubar=new JMenuBar(); 
JMenu file = new JMenu("File"); 
JMenu view = new JMenu("View"); 

JCheckBoxMenuItem sbar= new JCheckBoxMenuItem("Status-Bar"); 
sbar.setState(true); 
sbar.addActionListener(new ActionListener() 
{ 
public void actionPerformed(ActionEvent event) 
{ 


if (lbl.isVisible()) 
{lbl.setVisible(false);} 
else 
{lbl.setVisible(true);} 


}}); 




menubar.add(file); 
view.add(sbar); 
menubar.add(view); 
setJMenuBar(menubar); 

setSize(300,200); 
setLocationRelativeTo(null); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 
setVisible(true); 
} 

public static void main(String args[]) 
{new Chk();} 

} 

內部聲明JLabel lbl;「
爲什麼我不能使用JLabel lbl = new JLabel(「Label」);

+0

它說:「局部變量LBL從內部類訪問,需要被聲明爲final」 – subanki 2010-08-10 15:08:26

+0

所以每當我在構造函數中使用一個變量,它需要首先宣佈爲私人外部?或者我必須宣佈它是最終的,對嗎? – subanki 2010-08-10 15:25:59

+0

它取決於「變量」是否必須在所有類中重用。如果是這種情況,那麼它必須聲明爲一個字段(私有的,不在方法或構造函數中)。此外,如果此字段必須用於內部類(例如您的情況下的ActionListener),則必須將其聲明爲final。 – 2010-08-10 16:15:24

回答

3

您可以,但在閉包中使用的變量需要聲明爲final。

final JLabel lbl = new JLabel("StatusBar"); 
    lbl.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); 
    add(lbl, BorderLayout.SOUTH); 

這應該有效。

如果您想知道,閉包是您創建匿名內部類的實例並引用在封閉範圍內聲明的變量的部分。在這種情況下,「LBL」是從一個匿名的ActionListener實例中引用:

sbar.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      if (lbl.isVisible()) { 
       lbl.setVisible(false); 
      } else { 
       lbl.setVisible(true); 
      } 
     } 
    }); 
0

由於您試圖在構造函數之外的actionPerformed方法中使用它,因此您不能將其設置爲構造函數的私有。你可以通過聲明它來隱藏它,但我一直認爲這是一個可疑的技巧,我不知道它是否能夠工作,或者它只是在愚弄編譯器。

+0

因此,無論何時我在構造函數中使用變量,它需要第一次聲明爲私人外? – subanki 2010-08-10 15:10:58

+0

不,只有在構造函數中使用變量(ctor)時,纔會在構造函數外使用變量。如果它是在ctor內部宣佈而沒有最終確定的,只要ctor運行完畢就會消失。 – 2010-08-10 17:01:46

0

我認爲你可以,你只需要定義它最終

,你可以將它定義爲addActionListner之前的局部變量。

+0

如果我讓它最終我不能改變它的價值! 如果我想把它作爲最終在哪裏應該做外部或內部? – subanki 2010-08-10 15:09:28

+1

你爲什麼要改變它的參考? JLabel本身應該是相同的,但是他的文本可以通過setText()方法更新 – 2010-08-10 15:15:09

相關問題