Java控制车速

package org.cctv2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class RaceMap extends JPanel implements Runnable
{
    private int x=0,y=0; //bt的位置,也即控制的小方块的位置
    private int w=15,h=15; //bt的宽,高
    private int direction=0; //方向
    private boolean tag=true; //结束标示符
    JButton bt; //控制的小方块
    Thread th; //线程,获得此线程,方便对象调用此线程
    private double speed=1; //速度
    private Color color=Color.BLACK; //中间框的颜色
    //Icon icon;
    RaceMap()
    {
        //this.setSize(400, 400);
        setLayout(null);//要将布局管理器设为空,才能对里面的控件地方做设置
      setBackground(Color.WHITE);
        bt=new JButton();
       //bt.setIcon(icon);
        add(bt);
        bt.setBackground(Color.RED); //设置背景
        //setBounds(100,100,400,400);      
        bt.setBounds(0, 0, w, h);  //设置初始地方    
       bt.addKeyListener(new KeyAdapter() //添加键盘监听,控制方向
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode()==KeyEvent.VK_UP) //上
                {
                    if(direction==0) //本身为向上时,加速
                       speed+=0.1;
                   else if(direction==1) //本身为向下时,减速
                   {
                        speed-=0.1;
                        if(speed<=1)  //减速到1时,反向向上
                           direction=0;
                    }
                   else   //本身为向左或向右时,仅改变方向
                        direction=0;
                }
                else if(e.getKeyCode()==KeyEvent.VK_DOWN) //下
                    direction=1;
                else if(e.getKeyCode()==KeyEvent.VK_LEFT) //左
                    direction=2;
                else if(e.getKeyCode()==KeyEvent.VK_RIGHT) //右
                    direction=3;
            }
       });    
        th=new Thread(this);//获得此线程,方便下面对象直接启动此线程
    }            //要有继承Runnable或Thread才能用此,也即要有自己的线程
   
    public void makeRun()
    {
        tag=true;
        Graphics g=getGraphics();
        g.setColor(Color.MAGENTA);//这样画会容易被擦掉
        g.fillOval(10, 10, 50, 50);
        bt.requestFocusInWindow(); //自动获得焦点,不用按TAB再获得
        g.dispose();
    }
   
   public void setSpeed(double speed) //设置速度
   {
        this.speed=speed;
        bt.requestFocusInWindow(); //自动获得焦点,不用按TAB再获得
    }
   
   public void setFillRectColor(String st) //设置中间矩形的颜色
    {
       if(st.equals("蓝色"))
            color=Color.BLUE;
        else if(st.equals("绿色"))
            color=Color.GREEN;
       else
            color=Color.BLACK;
        repaint();
        bt.requestFocusInWindow(); //自动获得焦点,不用按TAB再获得
    }
   
   public void setButtonWidthHeigth(int w,int h)
    {
        this.w=w;
        this.h=h;
        bt.setSize(w, h);
        bt.requestFocusInWindow(); //自动获得焦点,不用按TAB再获得
    }
   
    public void run() 
    {
        bt.requestFocusInWindow(); //自动获得焦点,不用按TAB再获得
       while(tag)
        {          
            if(direction==0)  //向上 跟的第2句是出边框时的操作
            {                             //比如出上边框了就到最下面去
               y-=speed;
                if(y+h<=1) y=this.getHeight();              
            }
            else if(direction==1) //向下
          {
              y+=speed;
                if(y>=this.getHeight()) y=0;
            }
           else if(direction==2) //向左
            {
                x-=speed;
                if(x+w<=1) x=this.getWidth();
            }
            else //向右
           {
                x+=speed;
                if(x>=this.getWidth()) x=0;
            }
           bt.setLocation(x, y);
            try
           {
              Thread.sleep(10); //控制速度
           }
            catch(InterruptedException e)
          {}
           if(x+w>130&&x<330&&y+h>130&&y<330) //判断是否与中间矩形相碰
            {
                tag=false;
               repaint();
                x=0;
               y=0;
           }
      }
   }
    public void paint(Graphics g)
    {
        //g.setColor(Color.WHITE);
        //g.fillRect(0, 0, this.getWidth()-1, this.getHeight()-1);
       super.paint(g);//如果不写此,加的控件刚开始时不会显现
        if(tag==true) g.setColor(color); //画笔
           else g.setColor(Color.CYAN);
    g.fillRect(130, 130, 200, 200); //填充矩形
        //g.fillRect(40, 40, 25, 25);       
        if(tag==false)
        {
           g.setColor(Color.RED);          
           g.drawString("游戏结束",
                  this.getWidth()/2-30,this.getWidth()/2);
       }
         
    }
}

class UpPanel extends Panel
{
   TextField tf;   //速度
    JButton bt1;    //提交速度
    JButton bt2;   //开始
   Choice ch;   //指示中间框的颜色
    Checkbox cb1;
   Checkbox cb2;
   Checkbox cb3;
   CheckboxGroup cbg;
   public UpPanel()
   {
        setLayout(new FlowLayout(FlowLayout.LEFT));
       tf=new TextField(10);
       bt1=new JButton("提交速度");
        bt2=new JButton("点我开始");
        ch=new Choice();
        ch.add("黑色");
       ch.add("绿色");
        ch.add("蓝色");
        cbg=new CheckboxGroup();
        cb1=new Checkbox("小",cbg,false);
        cb2=new Checkbox("中",cbg,true);
        cb3=new Checkbox("大",cbg,false);
        add(tf);
       add(bt1);
        add(bt2);
        add(ch);
       add(cb1);
        add(cb2);
        add(cb3);
        //bt1.addActionListener(new myActionPerformed(tf));
   }
 
}

public class CarRace extends JFrame
{   
    RaceMap rm;  //主面板 下面(实际是在Frame中间)
    //Button bt;  //按钮 “点我开始”
    UpPanel upp; //面板2 上面
    //Thread th;
    public CarRace()
    {     
        super("RaceMapTest");
       rm=new RaceMap();
        //th=new Thread(rm);
       upp=new UpPanel();  
       upp.bt2.addActionListener(new myActionPerformed(rm));
        upp.bt1.addActionListener(new myActionPerformed(upp.tf,rm));
        upp.ch.addItemListener(new myItemListener(rm,upp.ch));
       upp.cb1.addItemListener(new myItemListener(rm,upp.cb1));
        upp.cb2.addItemListener(new myItemListener(rm,upp.cb2));
        upp.cb3.addItemListener(new myItemListener(rm,upp.cb3));
        //bt=new Button("点我开始");
       upp.setBackground(Color.CYAN);
        //upp.add(bt);
        //bt.addActionListener(this);
      
        setBounds(100, 100, 500, 530);
       setLayout(new BorderLayout());
        add(upp, BorderLayout.NORTH);
        add(rm,BorderLayout.CENTER);
       validate();
        this.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
           {
                dispose();
                System.exit(0);
           }

});
        setVisible(true);       
    } 
 
   public static void main(String []args)
    {
       new CarRace();
    }
}

class myActionPerformed implements ActionListener
{
    TextField tf;
   RaceMap rm;
    myActionPerformed(TextField tf,RaceMap rm) //此必须加上参数RaceMap
    {                            //要不会抛出异常 NullPointerException
       this.tf=tf;
        this.rm=rm;
    }
    myActionPerformed(RaceMap rm)
    {
        this.rm=rm;
    }
   public void actionPerformed(ActionEvent e)
    {
       JButton bt=(JButton)e.getSource();
        if(bt.getText().equals("提交速度"))//判断
        {
            String speed=tf.getText();           
            if(!(speed.equals("")))
            {
               try
               {
                   rm.setSpeed(Double.valueOf(speed));
                }
               catch(NumberFormatException ee)
                {
                    JOptionPane.showMessageDialog(rm,"输入的速度值非数字!");
                }
            }
         else
                JOptionPane.showMessageDialog(rm,"没有输入速度值!");
        }
       else if(bt.getText().equals("点我开始"))//判断
       {
            try//点击一次按钮后再点会出现IllegalThreadStateException异常
            {
                rm.th.start();
                rm.validate();          
            }
           catch(IllegalThreadStateException ee)
           {
               rm.makeRun();              
            }
       }
    }
}

class myItemListener implements ItemListener
{
    RaceMap rm;
    Choice ch;
   Checkbox cb;
    public myItemListener(RaceMap rm,Choice ch)
   {
        this.rm=rm;
        this.ch=ch;
    }
    public myItemListener(RaceMap rm,Checkbox cb)
    {
       this.rm=rm;
       this.cb=cb;
    }
    public void itemStateChanged(ItemEvent e)
    {
        if(e.getItemSelectable().equals(ch))//判断事件源是否为JComboBox
        {
           rm.setFillRectColor(e.getItem().toString());
          //rm.setFillRectColor(ch.getSelectedItem());//这样也行
       }
       else if(e.getItemSelectable().equals(cb))//判断事件源是否为
        {                                        //Checkbox
             if(e.getItem().toString().equals("小"))
                rm.setButtonWidthHeigth(10, 10);
           else if(e.getItem().toString().equals("大"))
               rm.setButtonWidthHeigth(20, 20);
            else if(e.getItem().toString().equals("中"))
                rm.setButtonWidthHeigth(15, 15);
        }           
    }
}

时间: 2024-07-30 05:10:35

Java控制车速的相关文章

java控制float和double的精度

在做读取Excel表格数据时,碰到有小数点的数字,用double和float来求和时会多出好多位小数,看起来总觉得怪怪的,怎样控制它的长度呢? DecimalFormat df = new DecimalFormat("########.0"); //四舍五入 value = Double.parseDouble(df.format(value)); 我这里是控制一位小数,如果要求两位,就写成########.00 java控制float和double的精度,布布扣,bubuko.co

Android(Java)控制GPIO的方法及耗时分析

前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍Android6.0权限的配置并对在Java层控制GPIO的耗时做简单分析. 以高通平台为例,权限配置主要修改HLOS/device/qcom/sepolicy/common目录下的file.te.file_contexts和system_app.te三个文件. file.te修改如下, # GPI

java 控制反转和依赖注入的理解

开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~ 这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现,使用接口的引用调用的方法,永远不需要改变 举一个栗子: 写个接口,说咱们购物去~ public interface IShopping {

JAVA——控制流程

在Java中,都要声明一个贷main()方法的公用类.程序从main()方法的第一条语句开始执行,随后一条一条地执行后续的语句,直到到达程序的终点 — main()方法的末尾.然而,在程序设计时,我们经常需要改变程序的控制流程,也就是语句的执行顺序.有三种基本技术可以改变程序的控制流程: 1.调用方法.调用方将导致控制流程离开当前方法当前方法,转移到被调用的方法.例如,当我们调用println(),控制程序离开main(),转到println(),并且在执行完成时返回main()方法. 2.选择

java控制执行流程--thinking in java学习

常用的控制执行流程有if-else:迭代while,do-while,for,foreach:return;break,continue;和break,continue配合使用的标签:switch:在过thinking in java这章的过程中,有两个地方又重新认识了一下,来和大家分享.1.return 有两个作用,1.设定一个方法的返回值:2.退出当前方法.因此任何方法都可以使用return语句,在void方法中使用return便是使用return的退出当前方法的作用.而且在返回void的方

java控制反转及依赖注入

先来看看控制反转的基本含义: 控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转.在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制.这称为控制反转.换句话说,就是将创建管理对象的工作交给容器来做. 传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象:而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建:谁控制谁?当然是

Java——控制循环结构

在某些时候,我们需要在某种条件出现时,强行终止本次循环或结束循环,而不是等到循环条件为 false 时 ,在Java中提供了 continue (结束本次循环) .break(跳出循环体)来控制循环结构.除此之外,return 可以结束整个方法,当然也就结束了一次循环. break:用于完全结束一个循环 ,跳出循环体. continue:中止本次循环,开始下次循环 public static void main(String[] args) { int count=0; //打印次数初始值 fo

java控制反转与依赖注入

1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public class Main { public static void main(String[] args) { /******** 一般写法,Main类与Chinese类和American类之间的强耦合 ***********/ // Chinese和American,当类和方法修改时,此处的类和方法也需要修改

Java 控制线程

Java 的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行. join 线程 Thread 提供了让一个线程等待另一个线程完成的方法—— join() 方法.当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被 join() 方法加入的 join 线程执行完为止. join() 方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程.当所有的小问题都得到处理后,再调用主线程来进一步操作. public clas