java Swing中的停止计时器

java Swing中的停止计时器,java,swing,timer,actionlistener,mouselistener,Java,Swing,Timer,Actionlistener,Mouselistener,我刚开始在Swing中使用计时器。我编写的程序基本上是将一个矩形上下移动到屏幕上的特定点,我使用计时器使其缓慢而平稳地运行。但我在试图阻止它时遇到了问题。代码如下: 提升等级更改矩形的y位置: public void moveUp(int destination){ speed++; if(speed>5){ speed = 5; } System.out.println("Speed is: "+s

我刚开始在Swing中使用
计时器
。我编写的程序基本上是将一个矩形上下移动到屏幕上的特定点,我使用计时器使其缓慢而平稳地运行。但我在试图阻止它时遇到了问题。代码如下:

提升等级更改矩形的y位置:

 public void moveUp(int destination){
        speed++;
        if(speed>5){
            speed = 5;
        }
        System.out.println("Speed is: "+speed);
        yPos -= speed;
        if(yPos < destination){
            yPos = destination;
            isStop = true;
        }
        setPos(xPos, yPos);
    }

为了可视化如何处理这个问题,我编写了一个小示例:

启动时,将创建两个矩形。当您在绘图区域上单击鼠标左键时,它们开始移动

到达目的地线路时,运动将停止

逻辑取决于矩形类中的状态。当计时器事件处理程序运行时,如果到达的所有矩形都具有ISSTTOPED状态,则会检查每个矩形的状态,并停止计时器:

        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1) {
                timer = new Timer(100, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        /** 
                         * Variable isStopped is used to track, if any 
                         * rectangle didn't reach the destination yet
                         */
                        boolean isStopped = true;

                        for(int i = 0; i < count; i++){
                            rectangles[i].moveUp(destination);
                            if (!rectangles[i].isStopped()) {
                                isStopped = false;
                            }
                        }
                        drawPanel.repaint();

                        /** 
                         * With all rectangles having arrived at destination, 
                         * the timer can be stopped
                         */
                        if (isStopped) {
                            timer.stop();
                        }
                    }
                });
                timer.start();
            }
        }
public void鼠标按下(MouseEvent e){
如果(例如getButton()==MouseEvent.BUTTON1){
计时器=新计时器(100,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
/** 
*变量ISS用于跟踪(如果有)
*矩形尚未到达目的地
*/
布尔值=真;
for(int i=0;i
从Rectangle类中摘录—在这里,您可以看到如何处理isStopped状态—内部作为私有isStop变量—可使用isStopped getter检索

/** 
 * Moves the rectangle up until destination is reached
 * speed is the amount of a single movement.
 */
public void moveUp(int destination) {
    if (speed < 5) {
        speed++;
    }

    y -= speed;

    if (y < destination) {
        y = destination;
        isStop = true;
    }
}

public boolean isStopped() {
    return isStop;
}
/**
*向上移动矩形,直到到达目标
*速度是单个运动的量。
*/
公共无效移动(整数目的地){
如果(速度<5){
速度++;
}
y-=速度;
如果(y<目的地){
y=目的地;
isStop=true;
}
}
公共布尔值(){
返回顶部;
}
以下是整个节目:

主程序移动矩形,创建绘图区域并提供控制:

package question;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class MovingRectangle extends JPanel {
    /**
     * The serial version uid.
     */
    private static final long serialVersionUID = 1L;

    private Rectangle[] rectangles = new Rectangle[10];
    private int count;
    private int destination;

    private JPanel controlPanel;
    private DrawingPanel drawPanel;
    private JButton stop;

    private Timer timer;

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Rectangles");
                frame.setContentPane(new MovingRectangle());
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public MovingRectangle(){
        /** Imaginary horizontal line - the destination */
        destination = 200;

        /** Create the control panel for the left side containing the buttons */
        controlPanel = new JPanel();
        controlPanel.setPreferredSize(new Dimension(120, 400));

        /** Create the button */
        stop = new JButton("Stop");
        stop.addActionListener(new ButtonListener());
        controlPanel.add(stop);

        /** Create a hint how to start the movement. */
        JTextArea textHint = new JTextArea(5, 10);
        textHint.setEditable(true);
        textHint.setText("Please click on the drawing area to start the movement");
        textHint.setLineWrap(true);
        textHint.setWrapStyleWord(true);
        controlPanel.add(textHint);

        /** Add control panel to the main panel */
        add(controlPanel);

        /** Create the drawing area for the right side */
        drawPanel = new DrawingPanel();

        /** Add the drawing panel to the main panel */
        add(drawPanel);

        /** With a left mouse button click the timer can be started */
        drawPanel.addMouseListener(new MouseListener() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1) {
                    timer = new Timer(100, new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            /** 
                             * Variable isStopped is used to track, if any 
                             * rectangle didn't reach the destination yet
                             */
                            boolean isStopped = true;

                            for(int i = 0; i < count; i++){
                                rectangles[i].moveUp(destination);
                                if (!rectangles[i].isStopped()) {
                                    isStopped = false;
                                }
                            }
                            drawPanel.repaint();

                            /** 
                             * With all rectangles having arrived at destination, 
                             * the timer can be stopped
                             */
                            if (isStopped) {
                                timer.stop();
                            }
                        }
                    });
                    timer.start();
                }
            }

            @Override
            public void mouseReleased(MouseEvent arg0) {
            }

            @Override
            public void mouseClicked(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });

        /** Add two rectangles to the drawing area */
        addRectangle(100, 30, 0, 370, new Color(255, 0, 0));
        addRectangle(120, 50, 200, 350, new Color(0, 0, 255));
    }

    private void addRectangle(final int widthParam, final int heightParam, final int xBegin, final int yBegin, final Color color) {
        /** Add a new rectangle, if array not filled yet */
        if (count < rectangles.length) {
            rectangles[count] = new Rectangle(widthParam, heightParam, xBegin, yBegin, color);
            count++;
            drawPanel.repaint();
        }
    }

    /** This inner class is used to handle the button event. */
    private class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
            if (e.getSource() == stop){
                timer.stop();
            }
        }
    }

    /** This inner class provides the drawing panel */
    private class DrawingPanel extends JPanel{
       /** The serial version uid. */
        private static final long serialVersionUID = 1L;

        public DrawingPanel() {
            this.setPreferredSize(new Dimension(400, 400));
            setBackground(new Color(200, 220, 255));
        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);

            /** Draw destination line */
            g.setColor(new Color(150, 150, 150));
            g.drawLine(0, destination, 400, destination);

            /** Draw rectangles */
            for(int i = 0; i < count; i++){
                rectangles[i].display(g);
            }
        }
    }
}
包装问题;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextArea;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共类MovingRectangle扩展了JPanel{
/**
*串行版本为uid。
*/
私有静态最终长serialVersionUID=1L;
私有矩形[]矩形=新矩形[10];
私人整数计数;
私人目的地;
专用JPanel控制面板;
私人绘图面板绘图面板;
私人按钮站;
私人定时器;
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新的JFrame(“矩形”);
setContentPane(新的MovingRectangle());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
公共移动矩形(){
/**假想水平线-目的地*/
目的地=200;
/**为包含按钮的左侧创建控制面板*/
控制面板=新的JPanel();
控制面板。设置首选尺寸(新尺寸(120400));
/**创建按钮*/
停止=新按钮(“停止”);
addActionListener(新按钮Listener());
控制面板。添加(停止);
/**创建如何开始移动的提示*/
JTextArea textHint=新的JTextArea(5,10);
textHint.setEditable(true);
text提示.setText(“请单击绘图区域开始移动”);
textHint.setLineWrap(true);
textHint.setWrapStyleWord(true);
添加(文本提示);
/**将控制面板添加到主面板*/
添加(控制面板);
/**创建右侧的绘图区域*/
drawPanel=新的DrawingPanel();
/**将图形面板添加到主面板*/
添加(绘图面板);
/**用鼠标左键单击计时器即可启动*/
drawPanel.AddMouseStener(新的MouseStener(){
@凌驾
公共无效鼠标按下(MouseEvent e){
如果(例如getButton()==MouseEvent.BUTTON1){
计时器=新计时器(100,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
/** 
*变量ISS用于跟踪(如果有)
*矩形尚未到达目的地
*/
布尔值=真;
for(int i=0;ipackage question;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class MovingRectangle extends JPanel {
    /**
     * The serial version uid.
     */
    private static final long serialVersionUID = 1L;

    private Rectangle[] rectangles = new Rectangle[10];
    private int count;
    private int destination;

    private JPanel controlPanel;
    private DrawingPanel drawPanel;
    private JButton stop;

    private Timer timer;

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Rectangles");
                frame.setContentPane(new MovingRectangle());
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public MovingRectangle(){
        /** Imaginary horizontal line - the destination */
        destination = 200;

        /** Create the control panel for the left side containing the buttons */
        controlPanel = new JPanel();
        controlPanel.setPreferredSize(new Dimension(120, 400));

        /** Create the button */
        stop = new JButton("Stop");
        stop.addActionListener(new ButtonListener());
        controlPanel.add(stop);

        /** Create a hint how to start the movement. */
        JTextArea textHint = new JTextArea(5, 10);
        textHint.setEditable(true);
        textHint.setText("Please click on the drawing area to start the movement");
        textHint.setLineWrap(true);
        textHint.setWrapStyleWord(true);
        controlPanel.add(textHint);

        /** Add control panel to the main panel */
        add(controlPanel);

        /** Create the drawing area for the right side */
        drawPanel = new DrawingPanel();

        /** Add the drawing panel to the main panel */
        add(drawPanel);

        /** With a left mouse button click the timer can be started */
        drawPanel.addMouseListener(new MouseListener() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1) {
                    timer = new Timer(100, new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            /** 
                             * Variable isStopped is used to track, if any 
                             * rectangle didn't reach the destination yet
                             */
                            boolean isStopped = true;

                            for(int i = 0; i < count; i++){
                                rectangles[i].moveUp(destination);
                                if (!rectangles[i].isStopped()) {
                                    isStopped = false;
                                }
                            }
                            drawPanel.repaint();

                            /** 
                             * With all rectangles having arrived at destination, 
                             * the timer can be stopped
                             */
                            if (isStopped) {
                                timer.stop();
                            }
                        }
                    });
                    timer.start();
                }
            }

            @Override
            public void mouseReleased(MouseEvent arg0) {
            }

            @Override
            public void mouseClicked(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });

        /** Add two rectangles to the drawing area */
        addRectangle(100, 30, 0, 370, new Color(255, 0, 0));
        addRectangle(120, 50, 200, 350, new Color(0, 0, 255));
    }

    private void addRectangle(final int widthParam, final int heightParam, final int xBegin, final int yBegin, final Color color) {
        /** Add a new rectangle, if array not filled yet */
        if (count < rectangles.length) {
            rectangles[count] = new Rectangle(widthParam, heightParam, xBegin, yBegin, color);
            count++;
            drawPanel.repaint();
        }
    }

    /** This inner class is used to handle the button event. */
    private class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
            if (e.getSource() == stop){
                timer.stop();
            }
        }
    }

    /** This inner class provides the drawing panel */
    private class DrawingPanel extends JPanel{
       /** The serial version uid. */
        private static final long serialVersionUID = 1L;

        public DrawingPanel() {
            this.setPreferredSize(new Dimension(400, 400));
            setBackground(new Color(200, 220, 255));
        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);

            /** Draw destination line */
            g.setColor(new Color(150, 150, 150));
            g.drawLine(0, destination, 400, destination);

            /** Draw rectangles */
            for(int i = 0; i < count; i++){
                rectangles[i].display(g);
            }
        }
    }
}
package question;

import java.awt.Color;
import java.awt.Graphics;

public class Rectangle {
    private int x, y, width, height;
    private Color color;
    private boolean isStop = false;
    private int speed = 0;

    public Rectangle(final int widthParam, final int heightParam, final int xBegin, final int yBegin, final Color colorParam) {
        width = widthParam;
        height = heightParam;
        this.x = xBegin;
        this.y = yBegin;
        this.color = colorParam; 
    }

    public void display(Graphics g){
        g.setColor(this.color);
        g.fillRect(this.x, this.y, this.width, this.height);
    }  

    /** 
     * Moves the rectangle up until destination is reached
     * speed is the amount of a single movement.
     */
    public void moveUp(int destination) {
        if (speed < 5) {
            speed++;
        }

        y -= speed;

        if (y < destination) {
            y = destination;
            isStop = true;
        }
    }

    public boolean isStopped() {
        return isStop;
    }
}
  Point rv;
 rv= rectangle.this.getLocation();
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     timer1.setInitialDelay(0);
     timer1.start();
     jTextArea1.append("Timer 1 Started Moving Down\n");
} 
    private Timer timer1 = new Timer(10, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        rv.y++;



        if (rv.y == 500) {
            timer1.stop();
            jTextArea1.append("Timer 1 Stopped\n");
            jTextArea1.append("Timer 2 Started Moving Up\n");
            timer2.setInitialDelay(0);
            timer2.start();

        }

        rectangle.this.setLocation(rv.x , rv.y);
        rectangle.this.repaint();

    }
});



 private Timer timer2 = new Timer(5, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
       rv.y--;

        if (rv.y == 200 ) {
            timer2.stop();
            jTextArea1.append("Timer 2 Stopped\n");
        }
          rectangle.this.setLocation(rv.x , rv.y);
         rectangle.this.repaint();
    }
});