myLabel定义成final试试!
private final myLabel= new JLabel("Hello World");

解决方案 »

  1.   

    推荐GUI的写法:
    public class HelloWorldJFC2 extends JPanel
    {
        private JFrame myFrame;
        JPopupMenu popup;
        public HelloWorldJFC2()
    {
            JLabel myLabel = new JLabel("Hello World");
            myLabel.setOpaque(true);
            add(myLabel);
             popup = new JPopupMenu();
        
             JMenuItem menuItem1 = new JMenuItem("Hello World");
               menuItem1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("Hello World popup");
                    myLabel.setText("test set");        //这句报措。      
                }
            });
      

  2.   

    对不起,刚才按错了。
    public class HelloWorldJFC2
    {
        public static void main(String[] args)
        {
            new HelloWorldJFC2().open();
        }
        // private since no one else should have access to it.
        private JFrame myFrame;
        private HelloWorldJFC2Control control;
        public HelloWorldJFC2()
        {
            control = new HelloWorldJFC2Control(this);
        }
        
        public void open()
        {
            myFrame = new JFrame();
            createContents();
            myFrame.open();
        }
        
        /* GUI Components */
        //package level since the control would access them.
        JLabel labelMine;
        JMenuItem itemHello;
        private void createContents()
        {
            ...
            itemHello = new JMEnuItem("Hello World");
            itemHello.addActionListener(control);
            ...
        }
    }//package level class since only UI access it.(A seperate java file)
    class HelloWorldJFC2Control implements ActionListener
    {
        private HelloWorldJFC2Control ui;
        HelloWorldJFC2Control(HelloWorldJFC2 ui)
        {
            this.ui = ui;
        }
        
        public void actionPerformed(Event e)
        {
            if (e == ui.itemHello)
                helloClicked();
            ....
        }
        
        private void helloClicked()
        {
            System.out.println("Hello World Popup.");
            ui.labelMine.setText("test set");
        }
    }
      

  3.   

    JLabel myLabel这个传入inner class就是应该声明为final
      

  4.   

    首先感谢楼上几位的热心帮助,尤其是hayai(生命树)的解决方案。
    现在的问题是把 JLabel myLabel声明为final 后还是一样的报措,难道详解上这个例子有问题?没听说啊。
      

  5.   

    现在问题已经解决,但是还有点疑惑希望大家能在此解惑。public class HelloWorldJFC2 extends JPanel {
        
        static JFrame myFrame;
        JLabel myLabel;  //在这里添加 final没有用
        JPopupMenu popup;
        public HelloWorldJFC2() {
            JLabel myLabel = new JLabel("Hello World");  //在这里就ok了  why?
            myLabel.setOpaque(true);
            add(myLabel);
             popup = new JPopupMenu();
        
             JMenuItem menuItem1 = new JMenuItem("Hello World");
               menuItem1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("Hello World popup");
                    myLabel.setText("test set");        //这句报措。      
                }
            });