2015-06-07 7 views
9

Il mio codice è di sotto. Compilano bene per me, comunque il mio professore sta dicendo che sta ottenendo un errore perché non ho alcune variabili nella mia classe dichiarate definitive. Eclipse non sembra avere un problema con questo sulla mia macchina, quindi non so come risolvere ciò che non riesco a vedere è sbagliato.Perché compilare un programma per me, ma non per un'altra persona?

Capisco che alcune variabili debbano essere definitive per funzionare in classi annidate, ma quelle che ho creato sembrano funzionare bene, definitive o meno.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.util.Random; 

public class JColorFrame extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        JColorFrame frame = new JColorFrame(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public JColorFrame() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 522, 339); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.NORTH); 

     JPanel panel_1 = new JPanel(); 
     contentPane.add(panel_1, BorderLayout.WEST); 

     JPanel panel_2 = new JPanel(); 
     contentPane.add(panel_2, BorderLayout.EAST); 

     JPanel panel_3 = new JPanel(); 
     contentPane.add(panel_3, BorderLayout.SOUTH); 

     Color[] color = new Color[8]; 
     color[0] = Color.black; 
     color[1] = Color.white; 
     color[2] = Color.red; 
     color[3] = Color.blue; 
     color[4] = Color.green; 
     color[5] = Color.yellow; 
     color[6] = Color.magenta; 
     color[7] = Color.orange; 

     JButton btnChangeColor = new JButton("Change Color"); 
     btnChangeColor.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       Random random = new Random(); 
       int random_1 = random.nextInt(4); 
       switch (random_1) { 
        case 0: 
         int random_2 = random.nextInt(8); 
         panel.setBackground(color[random_2]); 
         break; 
        case 1: 
         random_2 = random.nextInt(8); 
         panel_1.setBackground(color[random_2]); 
         break; 
        case 2: 
         random_2 = random.nextInt(8); 
         panel_2.setBackground(color[random_2]); 
         break; 
        case 3: 
         random_2 = random.nextInt(8); 
         panel_3.setBackground(color[random_2]); 
         break; 

       } 

      } 
     }); 

     contentPane.add(btnChangeColor, BorderLayout.CENTER); 
    } 
} 
+6

Stai usando Java 7> e il tuo professore sta usando Java 6 < – MadProgrammer

+2

@MadProgrammer: È più come se stessero usando Java 8, e il loro professore sta usando Java 7 o inferiore. – Makoto

+1

@Makoto Probabilmente, ho saltato Java 7: P – MadProgrammer

risposta

21

classi interne, come il tuo ActionListener, non possono accedere non final variabili dal campo di applicazione che lo contiene. Nelle versioni Java meno di 8, il compilatore genera automaticamente un errore se incontra questa situazione.

In Java 8, il compilatore eseguirà semplicemente le variabili final se non vengono modificate in nessun punto del file, poiché le vostre non sono qui.

Per ulteriori informazioni, vedere this post.

Probabilmente, il tuo professore utilizza Java 7 o precedente, quindi il tuo codice non viene compilato. Basta creare qualsiasi variabile locale che usi nella tua classe interna final.