我有一个标记为final的变量(number_of_cubes)。我需要在我的代码中的几个地方使用它。但我需要将其更改为滑块。你会建议什么?这就是我已经做过的事情:
class GrimMain{
static JFrame frame = new JFrame();
public static void main(String[] args) {
final DrawingComponent fps = new DrawingComponent();
final int number_of_cubes = 10;
final Rect[] r1 = new Rect[number_of_cubes];
final JButton button1= new JButton("Start");
button1.setLocation(700,600);
button1.setSize(100,30);
fps.add(button1);
final JButton button2= new JButton("Stop");
button2.setLocation(700,640);
button2.setSize(100,30);
fps.add(button2);
button1.setEnabled(true);
button2.setEnabled(true);
final JSlider slider = new JSlider(JSlider.HORIZONTAL,3,10,10);
slider.setLocation(300,600);
slider.setSize(290, 70);
slider.setMajorTickSpacing(330);
slider.setMinorTickSpacing(115);
slider.setPaintTicks(false);
slider.setPaintLabels(true);
fps.add(slider);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent changeEvent) {
//I want to change it here but I cant
number_of_cubes = Integer.valueOf(slider.getValue())
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
for(int i=0;i<number_of_cubes;i++){
fps.remRect(r1[i]);
frame.getContentPane().repaint();
}
button1.setEnabled(true);
button2.setEnabled(false);
}
});
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
System.out.println("yes");
Random rn = new Random();
Random rand = new Random();
for(int i=0; i <number_of_cubes;i++){
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
r1[i] = new Rect(rn.nextInt(600), rn.nextInt(400), 15, 15, randomColor);
}
for(int i=0; i < number_of_cubes;i++){
fps.addRect(r1[i]);
}
fps.animate();
button1.setEnabled(false);
button2.setEnabled(true);
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fps.setPreferredSize(new Dimension(900, 700));
frame.getContentPane().add(fps);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
这是我班级的完整代码
答案 0 :(得分:2)
您不能将某些内容声明为it will not change
,然后再进行更改。文档声明:
变量可以声明为final。最终变量可能只是 分配给一次。声明变量final可以起到很大作用 文档,其价值不会改变,可以帮助避免 编程错误。
由于多维数据集的值将更改,因此您无法将其声明为final
。请记住,final
值常量,常量不会更改。
答案 1 :(得分:1)
如果您需要更改它,那么您不能将其作为最终版本,这可能会让您对它有所了解,http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4
您的立方体数量是主要的而不是对象,因此修改该值会违反其最终状态。
答案 2 :(得分:0)
最终更像是设计决策和对编译器的提示而不是其他任何东西。您可以将某些内容定义为final,因此编译器会告诉您是否意外将其更改为其他位置。此外,如果编译器知道变量永远不会被更改,则可以进行各种优化。
因此,如果您的多维数据集的数量可能会随着时间而变化,那么这不是final
的候选者。
如果实际删除了final,那么你的代码有一个不同的问题:如果number_of_cubes发生了变化,那么数组的大小不会随之改变,所以稍后你会得到一个ArrayIndexOutOfBoundsException来通知你违反了数组约束。为立方体的数量编写一个setter可能是一个好主意,它可以调整其他需要调整的东西。例如:
void setNumberOfCubes(int cubes) {
number_of_cubes = cubes;
r1 = Arrays.copyOf(r1, cubes);
}