我有一个标记为最终(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);
}
}这是我的类的完整代码
发布于 2013-11-25 02:12:13
您不能将某些内容声明为it will not change,然后再对其进行更改。文档状态:
可以将变量声明为final。最后一个变量只能赋值一次。声明变量final可以作为有用的文档,说明它的值不会更改,并有助于避免编程错误。
由于多维数据集的值将更改,因此不能将其声明为final。请记住,final的值是常量,常量不会改变。
发布于 2013-11-25 02:08:39
如果你需要改变它,那么你不能把它作为期末考试,这可能会让你对它有所了解,http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4
你的立方体的数量是一个原生的,而不是一个对象,所以修改这个值违反了它的最终状态。
发布于 2013-11-25 02:19:49
最终结果更像是一个设计决策,也是对编译器的一个提示。你可以将某些东西定义为final,这样如果你不小心在其他地方修改了它,编译器就会告诉你。此外,如果编译器知道变量永远不会被更改,它可以进行各种优化。
因此,如果您的多维数据集数量可以随着时间的推移而变化,这就不是final的候选者。
然而,如果您实际删除了最后一个,那么您的代码就会有一个不同的问题:如果number_of_cubes改变了,数组的大小不会随之改变,所以稍后您会得到一个ArrayIndexOutOfBoundsException来通知您违反了数组约束。这可能是一个好主意,为立方体的数量编写一个设置器,以调整所有其他需要调整的东西。示例:
void setNumberOfCubes(int cubes) {
number_of_cubes = cubes;
r1 = Arrays.copyOf(r1, cubes);
}https://stackoverflow.com/questions/20177930
复制相似问题