2015-06-07 4 views
9

Mein Code ist unten. Es kompiliert sich gut für mich, aber mein Professor sagt, dass er einen Fehler bekommt, weil ich nicht einige Variablen in meiner Klasse für endgültig erklärt habe. Eclipse scheint damit auf meinem Rechner kein Problem zu haben, so dass ich nicht weiß, wie ich reparieren kann, was ich nicht sehen kann, ist falsch.Warum sollte ein Programm für mich kompilieren, aber nicht für eine andere Person?

Ich verstehe, dass einige Variablen endgültig sein müssen, um in verschachtelten Klassen zu arbeiten, aber die, die ich erstellt habe, scheinen gut zu funktionieren, endgültig oder nicht.

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

Sie verwenden Java 7> und Ihr Professor wird mit Hilfe von Java 6 < – MadProgrammer

+2

@MadProgrammer: Es ist mehr wie sie Java verwenden 8 und ihr Professor ist mit Java 7 oder niedriger. – Makoto

+1

@Makoto Wahrscheinlich habe ich irgendwie Java 7: P übersprungen – MadProgrammer

Antwort

21

Innere Klassen, wie Ihr ActionListener, hat keinen Zugriff auf nicht final Variablen aus dem Anwendungsbereich, die es enthält. In Java-Versionen kleiner als 8 wird der Compiler automatisch einen Fehler ausgeben, wenn er diese Situation antrifft.

In Java 8 erstellt der Compiler einfach die Variablen final, wenn sie nirgendwo in der Datei geändert werden, da Ihre nicht hier sind.

Weitere Informationen finden Sie unter this post.

Wahrscheinlich verwendet Ihr Professor Java 7 oder älter, also wird Ihr Code nicht kompiliert. Machen Sie einfach alle lokalen Variablen, die Sie in Ihrer inneren Klasse verwenden final.

Verwandte Themen