在JAVA编程中

在JAVA编程中,java,swing,Java,Swing,我想创建一个技能程序,就像魔兽世界一样,,, 我的问题是:操作侦听器希望最终确定整数sp…但是当我最终确定整数sp时,它说无法更改最终整数的值 以下是代码,请尝试运行它: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Skills { public static void main(String[] args) { //DECLARATION int sp = 0

我想创建一个技能程序,就像魔兽世界一样,,, 我的问题是:操作侦听器希望最终确定整数sp…但是当我最终确定整数sp时,它说无法更改最终整数的值

以下是代码,请尝试运行它:

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 ++;
        }
    });
   //...................................................................................................................................
}

}A
final
变量是,嗯,
final
。这意味着它的值在初始化后不能更改(或者,对于对象类型,它的引用不能更改)

参考:

它不适用于
++
的原因是它实际上是一个重新分配(
sp=sp+1

编辑

另外,不将其声明为final不起作用的原因是,您正在匿名类中使用它。为了能够在匿名类中使用它,它必须声明为
final
,因为编译器需要确保引用实际上是它期望的引用。如果它可以更改运行时,匿名类实际上会对错误的变量进行操作


但由于您试图在这个anynmous类中重新分配它,所以它不能是最终的。。。所以你想做的是不可能的。我建议您创建一个新类,跟踪您的
sp
,然后在此对象上创建一个
increment()
方法。

如果您不懂英文“无法更改最终整数的值”,您可以用谷歌翻译它。您应该将
sp
变量设置为类成员
private int-sp。另外,开始使用
new…
并将代码拆分为几个方法,而不是将所有内容都放在
main
中。最后,考虑使用LayOutMeor而不是设置它<代码> null <代码>无处不在。你应该重新措辞和格式化你的问题,并把代码降到一点。你能复制我的代码并运行它吗。。。。给我一些解决办法,因为我是个乞丐对不起我的失礼。。你能复制我的代码并运行它吗。。。。给我一些解决方案,因为我是一个乞丐,对不起,你已经测试过了。只是不要声明它是final。但是当我不声明它是final时,它说我需要确定int,,,当我确定int时,它说不能更改,,,我也尝试了这个(sp=sp+1),但它不起作用。另一个解决方案是一个单元素的final数组。