我是新来的java,我正在寻求一些帮助。我遇到的问题是,我无法在主类中更改不同类中的速度变量。从ChangeListener方法更改ArrayList中所有项目的速度
我有setter/getter方法,但我遇到的问题是决定哪个“对象”来解决setter/getter方法。
此滑块用于更改ArrayList中所有龟的速度。如果我可以得到一些帮助,那会很棒。除了速度变化之外,ChangeListener方法的其余部分也适用。
主类:
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.awt.event.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
class TurtleProgram
{
\t private JFrame frame;
\t private Canvas canvas;
\t private JPanel lowerPanel;
\t private JButton addTurtleButton;
\t private ArrayList<DynamicTurtle> turtles;
\t private JSlider turtleSpeed;
\t private int oldSliderState = 100;
\t
\t public static void main(String[] args)
\t {
\t \t new TurtleProgram();
\t }
\t public TurtleProgram()
\t {
\t \t frame = new JFrame();
\t \t canvas = new Canvas();
\t \t lowerPanel = new JPanel();
\t \t lowerPanel.setLayout(new FlowLayout());
\t \t DynamicTurtle referenceTurtle = new DynamicTurtle(canvas , new CartesianCoordinate(400,300));
\t \t
\t \t turtles = new ArrayList<DynamicTurtle>();
\t \t turtles.add(new RandomTurtleB(canvas, 400, 300)); \t \t
\t \t addTurtleButton = new JButton("Add A Turtle?");
\t \t lowerPanel.add(addTurtleButton);
\t \t turtleSpeed = new JSlider(0, 100, 100);
\t \t lowerPanel.add(turtleSpeed);
\t \t frame.setTitle("Welcome to Button Simulator!");
\t \t frame.setSize(800, 600);
\t \t frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); \t \t
\t \t frame.setVisible(true); \t \t
\t \t frame.add(lowerPanel, BorderLayout.PAGE_END);
\t \t frame.add(canvas);
\t \t addTurtleButton.addActionListener(new ActionListener()
\t \t {
\t \t \t public void actionPerformed(ActionEvent event)
\t \t \t {
\t \t \t \t turtles.add(new RandomTurtleB(canvas, 400, 300));
\t \t \t }
\t \t });
\t \t turtleSpeed.addChangeListener(new ChangeListener()
\t \t {
\t \t \t public void stateChanged(ChangeEvent event)
\t \t \t {
\t \t \t \t int currentSliderState = turtleSpeed.getValue();
\t \t \t \t int currentSpeed = (turtles.get(i)).getSpeed(); //HERE I CANNOT USE THE TURTLES IN THE ARRAYLIST TO SET SPEED
\t \t \t \t if(currentSliderState < oldSliderState)
\t \t \t \t {
\t \t \t \t \t System.out.println("is less");
\t \t \t \t \t (turtles.get(i)).setSpeed(currentSpeed - 100); //DECREASES ALL TURTLES SPEED
\t \t \t \t }
\t \t \t \t else if(currentSliderState > oldSliderState)
\t \t \t \t {
\t \t \t \t \t System.out.println("is more");
\t \t \t \t \t (turtles.get(i)).setSpeed(currentSpeed + 100); //INCREASES ALL TURTLES SPEED
\t \t \t \t }
\t \t \t \t oldSliderState = (turtles.get(i)).getValue(); \t \t \t \t
\t \t \t }
\t \t }); \t \t
\t \t gameLoop();
\t }
\t private void gameLoop()
\t {
\t \t int deltaTime = 20;
\t \t
\t \t while(true)
\t \t {
\t \t \t for (int i = 0; i < turtles.size(); i++)
\t \t \t {
\t \t \t \t (turtles.get(i)).unDrawTurtle(); \t \t \t \t
\t \t \t \t (turtles.get(i)).wrapPosition((turtles.get(i)).getPositionX(), (turtles.get(i)).getPositionY());
\t \t \t }
\t \t \t for (int i = 0; i < turtles.size(); i++)
\t \t \t {
\t \t \t \t (turtles.get(i)).update(1000); \t
\t \t \t }
\t \t \t for (int i = 0; i < turtles.size(); i++)
\t \t \t {
\t \t \t \t (turtles.get(i)).drawTurtle(); \t \t \t \t
\t \t \t }
\t \t
\t \t Utils.pause(deltaTime/2);
\t \t } \t
\t } \t
}
含有的setter/getter方法的类:
class DynamicTurtle extends Turtle
{
\t private int speed = 100;
\t private int time;
\t private double xPos, yPos;
\t private CartesianCoordinate myLocation;
\t private int Angle = 0;
\t DynamicTurtle(Canvas canvas, CartesianCoordinate initLocation)
\t {
\t \t super(canvas, initLocation); \t \t
\t }
\t DynamicTurtle(Canvas canvas, double xPosition, double yPosition) //THE PROBLEM CONSTRUCTOR
\t {
\t \t super(canvas, new CartesianCoordinate(xPosition, yPosition)); \t \t
\t }
\t public int getSpeed()
\t {
\t \t return this.speed;
\t }
\t public void setSpeed(int speed)
\t {
\t \t this.speed = speed;
\t }
\t public void update(int time)
\t {
\t \t this.move((speed*100/time)); \t
\t \t canvas.removeMostRecentLine();
\t }
}
谢谢你们提前帮忙,我还没有从Main中删除代码(我知道它很长),所以你可以看到我在处理主ArrayLists的过程中的逻辑。我知道我不能使用这个“get(i)”。干杯。
是否所有的龟都有相同的速度? –
@SaviourSelf你好,是的。在DynamicTurtle类中,所有的龟具有相同的速度,速度变量仅用于update()方法。 –
如果所有的海龟总是以相同的速度移动,你可以使速度变为“静态”。 –