2013-04-29 3 views
-8

나는 워크 래프트에서처럼, 과 같은 스킬 프로그램을 만들고 싶습니다. 제 질문은 : 액션 리스너가 정수 sp를 최종적으로 만들고 싶습니다 ...하지만 최종 정수 sp가 나오면 최종 정수의 값 ....자바 프로그래밍에서

을 Heres 코드를 변경하고 실행 해보세요 수 없습니다

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
public class Skills 
{ 
public static void main(String[] args) 
{ 
    //DECLARATION 
    int sp = 0; 
    JFrame skillframe = new JFrame("Skills"); 
    final JPanel panel1 = new JPanel(); 
    final JPanel panel2 = new JPanel(); 
    ImageIcon s1 = new ImageIcon("skill1.jpg"); 
    ImageIcon s2 = new ImageIcon("skill2.jpg"); 
    ImageIcon s3 = new ImageIcon("skill3.jpg"); 
    ImageIcon s4 = new ImageIcon("skill4.jpg"); 
    ImageIcon s5 = new ImageIcon("stats.gif"); 
    final JButton skills = new JButton("Skills"); 
    JButton skill1 = new JButton(s1); 
    JButton skill2 = new JButton(s2); 
    JButton skill3 = new JButton(s3); 
    JButton skill4 = new JButton(s4); 
    JButton stats = new JButton(s5); 
    final JButton back = new JButton("BacK"); 
    final JButton levelup = new JButton("Level UP!"); 
    JLabel points = new JLabel("Skill Points : " + sp); 

    ///SETTINGS : 
    // Skills 
    panel1.add(skills); 
    skills.setBounds(226, 82, 64, 64); 
    skills.setBackground(Color.black); 
    skills.setForeground(Color.white); 
    // Level UP! 
    panel1.add(levelup); 
    levelup.setBounds(10, 82, 100, 64); 
    levelup.setBackground(Color.black); 
    levelup.setForeground(Color.white); 
    // Skill 1 
    panel2.add(skill1); 
    skill1.setBounds(10, 10, 64, 64); 
    // Skill 2 
    panel2.add(skill2); 
    skill2.setBounds(82, 10, 64, 64); 
    // Skill 3 
    panel2.add(skill3); 
    skill3.setBounds(154, 10, 64,64); 
    // Skill 4 
    panel2.add(skill4); 
    skill4.setBounds(226, 10, 64, 64); 
    // Stats 
    panel2.add(stats); 
    stats.setBounds(10, 82, 64, 64); 
    // Back 
    panel2.add(back); 
    back.setBounds(226, 82, 64, 64); 
    back.setBackground(Color.black); 
    back.setForeground(Color.white); 
    // Points 
    panel2.add(points); 
    points.setBounds(100, 82, 100, 64); 
    points.setForeground(Color.white); 
    // Frame 
    skillframe.setSize(310,195); 
    panel1.setSize(310,195); 
    panel2.setSize(310,195); 
    skillframe.add(panel1); 
    skillframe.add(panel2); 
    panel1.setBackground(Color.black); 
    panel2.setBackground(Color.black); 
    panel1.setLayout(null); 
    panel2.setLayout(null); 
    panel2.setVisible(false); 
    skillframe.setVisible(true); 
    // ACTIONLISTENER 
    skills.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      panel1.setVisible(false); 
      panel2.setVisible(true); 
    //....................................................................................................................................................... 
    back.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      panel1.setVisible(true); 
      panel2.setVisible(false); 

     } 
    }); 
    //....................................................................................................................................................... 
     } 
    }); 
    //...........................................................................................................................................................  
    levelup.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      sp ++; 
     } 
    }); 
    //................................................................................................................................... 
} 

}

+0

영어로 이해할 수 없다면 google로 번역 할 수 있습니다. "최종 정수의 값을 변경할 수 없습니다." – Ankit

+0

당신은'sp' 변수를'private int sp;'변수로 만들어야합니다. 또한'new ... '를 사용하고'main'에 모든 것을 넣는 것보다 코드를 여러 가지 방법으로 분리하십시오. 마지막으로 LayoutManager를 모든 곳에서 'null'로 설정하는 대신 사용하는 것을 고려하십시오. –

+0

질문을 다시 말하고 형식을 지정해야하며 코드를 꼭 잘라야합니다. – NilsH

답변

2

final 변수는, 음, final입니다. 즉, 객체 유형이 초기화 된 후에는 값을 변경할 수 없거나 객체 유형의 경우 참조를 변경할 수 없다는 의미입니다.

참조 : http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4

++ 작동하지 않는 이유는 재 할당이 적용되는 것입니다 (sp = sp + 1)

편집

는 또한, 이유는 아무튼 이 아니고으로 끝내면 익명의 클래스에서 사용하고있는 것입니다. 익명 클래스에서 사용할 수 있으려면 컴파일러에서 참조가 실제로 참조가 될 것으로 기대해야하기 때문에 final으로 선언해야합니다. 런타임을 변경할 수있는 경우 익명 클래스는 본질적으로 잘못된 변수에서 작동합니다.

하지만이 임의의 클래스 안에 다시 할당하려고 했으므로 최종 수 없으므로 ...하려는 일은 불가능합니다. sp을 추적하는 새 클래스를 만든 다음이 개체에 increment() 메서드를 만드는 것이 좋습니다.

+0

mam/sir .. 코드를 실행 해주세요 ^^ .... 그리고 저에게 해결책을주세요, 불편을 끼쳐 드려서 죄송합니다. –

+0

이미 솔루션을 테스트했습니다. 마지막으로 선언하지 마십시오. – NilsH

+0

하지만 내가 마지막으로 선언하지 않을 때, 내가 최종 정수가 필요하다고 말합니다 ,,,, 그리고 마지막 int 때, 그것은 변경할 수 없다고 말합니다 ,,, –

관련 문제