2016-05-12 57 views
1

我是新來的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)」。乾杯。

+0

是否所有的龜都有相同的速度? –

+0

@SaviourSelf你好,是的。在DynamicTurtle類中,所有的龜具有相同的速度,速度變量僅用於update()方法。 –

+0

如果所有的海龜總是以相同的速度移動,你可以使速度變爲「靜態」。 –

回答

0

ChangeListener類中,您可以通過TurtleProgram.this.turtles訪問該turtles變量。 TurtleProgram.this可以得到TurtleProgram的封閉實例,其中構建了ChangeListener

但是,正如救世主自己在他的評論中所建議的那樣,如果不同的海龜永遠不會有相同的速度,那麼只需使速度變量以及其獲取/設置方法爲靜態。

相關問題