Re: Problem with Timer object
Hi , Sorry for that mess . I use tab and space when I typed the code
into the Google window and at the end it displayed like that . My
problem is how to pause the elevator when it reachs a chosen floor
(picked by pressing one button on the button panel). My idea is to
use another Pause( contains another timer ) class to do this . When
the current floor is the destination floor , I use this code segment
tm.stop();
new Pause(); // call the pause so that the elevator will pause
for a short time
tm.start(); // restart Timer tm so that the elevator continues
running
but it doesn't work . This afternoon when i passed tm into Pause
That means new Pause(Timer tm) and restart the tm inside Pause's
actionPerformed it surprisingly worked . The elevator could pause.
That maked me confused .
I post all of my code here . Thank all for your help and advice .
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
//The main class
public class Elevator_Simulation extends JFrame{
public JLabel state; // display the state of the elevator
private JLabel id; //your name and group
public ButtonPanel control; //the button control panel
private Elevator elevator; // the elevator area
private final int width = 400;
private final int height = 500;
public Container elevatorPanel;
private int delay ;
//constructor
public Elevator_Simulation() {
// Create GUI
setTitle("Elvator Simulation");
setSize(width,height);
setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE);
buildPanel();
elevator = new Elevator(this);
elevator.beginOperation();
}
public void buildPanel(){
id = new JLabel("MyName SE6",JLabel.CENTER);
elevatorPanel = getContentPane();
control = new ButtonPanel();
elevatorPanel.setLayout(new BorderLayout());
elevatorPanel.add(control,BorderLayout.WEST);
elevatorPanel.add(id,BorderLayout.NORTH);
}
public ButtonPanel getButtonPanel(){
return control ;
}
// Main method
public static void main(String[] args) {
// Create a frame and display it
new Elevator_Simulation();
}
} //the end of Elevator_Simulation class
public class Elevator extends JPanel implements ActionListener {
private boolean up ; // the elevator is moving up or down
private int width; // Elevator width
private int height; // Elevator height
private int xco; // The x coordinate of the elevator's
upper left corner
private int yco; // The y coordinate of the elevator's
upper left corner
private int dy0; // Moving interval
private int topy; //the y coordinate of the top level
private int bottomy; // the y coordinate of the bottom level
public Timer tm; //the timer to drive the elevator movement
private final int delay = 200 ;
private int speed = 40 ;
private Elevator_Simulation app;
// Paint elevator area
public Elevator(Elevator_Simulation app){
setSize(300,400);
dy0 = 1 ;
bottomy = getHeight()*7/8;
yco = bottomy;
this.app = app ;
up = true;
}
public void beginOperation(){
tm = new Timer(delay/speed,this);
tm.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
width = getWidth()/8;
height =getHeight()/8;
for (int i=0;i<=8;i++){
g.drawLine(0,height*i,width*8,height*i);
}
xco = getWidth()/2;
g.setColor(Color.black);
g.drawRect(xco,yco,width,height);
g.drawLine(xco+width/2,yco,xco+width/2,yco+height);
app.getContentPane().add(this,BorderLayout.CENTER);
app.setVisible(true);
}
//Handle the timer events
public void actionPerformed(ActionEvent e) {
tm.setDelay(delay/speed);
height = getHeight()/8;
int curFloor = 7-yco/height ;
// Check if the curFloor == the destFloor
if (yco % height == 0 && app.control.bp[curFloor])
{
tm.stop();
new Pause();
tm.start();
app.getButtonPanel().restoreButtonState(curFloor);
}
if (up){
if (yco>=dy0)
yco -=dy0;
else up=false ;
}
else {
if (yco<(getHeight()*7/8-dy0))
yco +=dy0;
else up=true;
}
repaint();
app.elevatorPanel.add(this,BorderLayout.CENTER);
app.setVisible(true);
}
class Pause implements ActionListener
{
Timer tmpTimer ;
int times;
public Pause(){
int delayTime = delay/speed*50;
tmpTimer = new Timer(delayTime,this);
tmpTimer.start();
times = 1;
}
public void actionPerformed(ActionEvent e) {
if (times==2){ tmpTimer.stop();
}
else times++;
}
}
}
public class ButtonPanel extends JPanel {
public JButton b[] = new JButton[8]; // 8 Buttons
public boolean bp[] = new boolean[8]; // the state of
buttons, pressed or not
//constructor
public ButtonPanel() {
//create GUI
GridLayout gLayout = new GridLayout(8,1);
setLayout(gLayout);
for (int i=7;i>=0;i--) {
b[i] = new JButton("Storey "+(i+1));
b[i].addActionListener(new ButtonAction());
add(b[i]);
bp[i]= false;
}
}
public void restoreButtonState(int i){
bp[i] = false;
b[i].setBackground(Color.white);
}
class ButtonAction extends JFrame implements ActionListener{
public void actionPerformed(ActionEvent e) {
//handle the button pressing events
JButton button = (JButton)e.getSource();
button.setBackground(Color.red);
String actionCommand = e.getActionCommand();
int num =
Integer.parseInt(actionCommand.charAt(actionCommand.length()-1)+"");
bp[num-1] = true;
}
}
} //the end of ButtonPanel class