2010-08-10 79 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

相关问题