Java GUI保持挂起

时间:2013-03-19 23:06:44

标签: java swing oop event-handling

嘿伙计们需要你的帮助解决我在我的代码中开发的这个java问题,我创建了一个基本上用作汽车竞赛模拟器的GUI,My Events适用于我的GUI,除了我的startrace事件,这是一个按钮开始比赛,iv只完成比赛的第一部分,但它没有工作,所以我想在我继续前解决问题。很难解释它会更容易我显示代码(在下面),我不是想要勺子喂,所以请不要开始给我糟糕的投票,并说我没有提供足够的细节,因为我真的不知道什么我可以说我即将写的东西。我不知道问题是什么。当我调试它(​​因为即时通讯使用Eclipse IDE)时,不起作用的部分只会使整个窗口变黑并且没有任何显示大约一分钟然后它会跳过大部分代码,甚至不做其余的事情。如果你需要更多的信息,请问我,我会告诉你我只是人类,不知道你希望我推迟的每一个细节。我有很多课程,但他们可能会让你们更容易混淆,所以我只会粘贴我遇到问题的课程。

(注意:SportCar-是一个有5个子类的超级类(Astonmatin,奥迪,法拉利,保时捷,兰博基尼))

(注意:Track是GUI本身的一个类,它是一个大类,使用来自SportsCar及其子类的Variable和Methods,所有方法和变量工作都不是问题)

(注意:问题在于actionPerformed(ActionEvent startrace)) 我希望我已经给了足够的细节,欢迎任何帮助。提前感谢你。

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




public class Track extends JFrame {

    private JComboBox ChooseYourCar;
    private JComboBox ChooseOppsCar; 
    private JButton StartRace;
    private JTextArea CheckYourCarAtts;
    private JTextArea CheckOppsCarAtts;
    private JTextArea Commentry; 
    private String temp;
    private String temp1;
    private String[] Cars = {"Choose Car Please ","Aston martin","Audi","Ferrari","Porsche","Lamborghini"};
    private int counter=0;
    private JTextField[] Green= new JTextField[11];
    private JTextField[] Green1= new JTextField[11];
    private JPanel Track = new JPanel();
    private SportCar first;
    private SportCar Second;

    public Track(){
        JPanel Center = new JPanel();
        JPanel West = new JPanel();
        JPanel East= new JPanel();
        JPanel North = new JPanel();
        Track.setLayout(new GridLayout(2,11,0,3));


        while (counter!=11)
        {

            Green[counter]= new JTextField("");
            Green[counter].setBackground(Color.GREEN);
            Green1[counter]= new JTextField("");
            Green1[counter].setBackground(Color.GREEN);
            counter++;  
             }


        counter= 0;
        while (counter!=11){
        Track.add(Green[counter]);
        counter++;

        }

        counter= 0;
        while (counter!=11){
            Track.add(Green1[counter]);
            counter++;

        }



        add(West, BorderLayout.WEST);
        add(Center, BorderLayout.CENTER);
        add(East, BorderLayout.EAST);
        add(North,BorderLayout.NORTH);
        add(Track,BorderLayout.SOUTH);



        ChooseYourCar = new JComboBox(Cars);
        West.add(ChooseYourCar);
        ChooseOppsCar = new JComboBox(Cars);
        West.add(ChooseOppsCar);
        StartRace = new JButton("Start Race");
        East.add(StartRace);
        CheckYourCarAtts = new JTextArea(12,30);
        CheckYourCarAtts.setBackground(Color.RED);
        Center.add(CheckYourCarAtts);
        CheckOppsCarAtts = new JTextArea(12,30);
        CheckOppsCarAtts.setBackground(Color.RED);
        Center.add(CheckOppsCarAtts);
        Commentry = new JTextArea(2,50);
        North.add(Commentry);



        event chooseyourcar = new event();
        ChooseYourCar.addActionListener(chooseyourcar);
        event1 Chooseoppscar = new event1();
        ChooseOppsCar.addActionListener(Chooseoppscar);
        event2 startrace = new event2();
        StartRace.addActionListener(startrace);



    }
    public class event implements ActionListener{
        public void actionPerformed(ActionEvent chooseyourcar){
            if(ChooseYourCar.getSelectedItem()=="Aston martin")
            {
                SportCar AstonMartin = new Astonmartin(400,1.0,1200,220);
                String str=("ASTON MARTIN\n"+"This is the Car You have currently Selected \n" +"Horsepower: " +AstonMartin.getHorsepower()+"\n"+ "Weight: "+ AstonMartin.getWeight()+ "\n"+ "Topspeed: "+ AstonMartin.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ AstonMartin.acceleration()+ "\n"+ "The Fuel Consumption is: "+ AstonMartin.GetFuelConsumption());
                CheckYourCarAtts.setText(str);
            }
            if(ChooseYourCar.getSelectedItem()=="Audi")
            {
                SportCar Audi = new Audi(300,1.2,1200,200);
                String str=("AUDI\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Audi.getHorsepower()+"\n"+ "Weight: "+ Audi.getWeight()+ "\n"+ "Topspeed: "+ Audi.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Audi.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Audi.GetFuelConsumption());
                CheckYourCarAtts.setText(str);
            }
            if(ChooseYourCar.getSelectedItem()=="Ferrari")
            {
                SportCar Ferrari = new Ferrari(440,0.8,900,260);
                String str=("FERRARI\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Ferrari.getHorsepower()+"\n"+ "Weight: "+ Ferrari.getWeight()+ "\n"+ "Topspeed: "+ Ferrari.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Ferrari.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Ferrari.GetFuelConsumption());
                CheckYourCarAtts.setText(str);
            }
            if(ChooseYourCar.getSelectedItem()=="Porsche")
            {
                SportCar Porsche = new Porsche(380,0.9,1000,220);
                String str=("PORSCHE\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Porsche.getHorsepower()+"\n"+ "Weight: "+ Porsche.getWeight()+ "\n"+ "Topspeed: "+ Porsche.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Porsche.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Porsche.GetFuelConsumption());
                CheckYourCarAtts.setText(str);
            }
            if(ChooseYourCar.getSelectedItem()=="Lamborghini")
            {
                SportCar Lamborghini = new Lamborghini(440,0.7,900,250);
                String str=("LAMBORGHINI\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Lamborghini.getHorsepower()+"\n"+ "Weight: "+ Lamborghini.getWeight()+ "\n"+ "Topspeed: "+ Lamborghini.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Lamborghini.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Lamborghini.GetFuelConsumption());
                CheckYourCarAtts.setText(str);
            }


}

}

        public class event1 implements ActionListener{
            public void actionPerformed(ActionEvent chooseoppscar){
                if(ChooseOppsCar.getSelectedItem()=="Aston martin")
                {
                    SportCar AstonMartin = new Astonmartin(400,1.0,1200,220);
                    String str=("ASTON MARTIN\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +AstonMartin.getHorsepower()+"\n"+ "Weight: "+ AstonMartin.getWeight()+ "\n"+ "Topspeed: "+ AstonMartin.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ AstonMartin.acceleration()+ "\n"+ "The Fuel Consumption is: "+ AstonMartin.GetFuelConsumption());
                    CheckOppsCarAtts.setText(str);
                }
                if(ChooseOppsCar.getSelectedItem()=="Audi")
                {
                    SportCar Audi = new Audi(300,1.2,1200,200);
                    String str=("AUDI\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Audi.getHorsepower()+"\n"+ "Weight: "+ Audi.getWeight()+ "\n"+ "Topspeed: "+ Audi.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Audi.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Audi.GetFuelConsumption());
                    CheckOppsCarAtts.setText(str);
                }
                if(ChooseOppsCar.getSelectedItem()=="Ferrari")
                {
                    SportCar Ferrari = new Ferrari(440,0.8,900,260);
                    String str=("FERRARI\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Ferrari.getHorsepower()+"\n"+ "Weight: "+ Ferrari.getWeight()+ "\n"+ "Topspeed: "+ Ferrari.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Ferrari.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Ferrari.GetFuelConsumption());
                    CheckOppsCarAtts.setText(str);
                }
                if(ChooseOppsCar.getSelectedItem()=="Porsche")
                {
                    SportCar Porsche = new Porsche(380,0.9,1000,220);
                    String str=("PORSCHE\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Porsche.getHorsepower()+"\n"+ "Weight: "+ Porsche.getWeight()+ "\n"+ "Topspeed: "+ Porsche.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Porsche.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Porsche.GetFuelConsumption());
                    CheckOppsCarAtts.setText(str);
                }
                if(ChooseOppsCar.getSelectedItem()=="Lamborghini")
                {
                    SportCar Lamborghini = new Lamborghini(440,0.7,900,250);
                    String str=("LAMBORGHINI\n"+"This is the Car You have currently Selected\n" +"Horsepower: " +Lamborghini.getHorsepower()+"\n"+ "Weight: "+ Lamborghini.getWeight()+ "\n"+ "Topspeed: "+ Lamborghini.getTopspeed()+ "\n"+ "The car goes from 0-60Mph(secs) in: "+ Lamborghini.acceleration()+ "\n"+ "The Fuel Consumption is: "+ Lamborghini.GetFuelConsumption());
                    CheckOppsCarAtts.setText(str);
                }
    }
}   

        public class event2 implements ActionListener{
            public void actionPerformed(ActionEvent startrace){ 
                if(ChooseYourCar.getSelectedItem()=="Aston martin")
                {
                    SportCar AstonMartin = new Astonmartin(400,1.0,1200,220);
                    first= AstonMartin;
                }
                if(ChooseYourCar.getSelectedItem()=="Audi")
                {
                    SportCar Audi = new Audi(300,1.2,1200,200);
                     first= Audi;
                }
                if(ChooseYourCar.getSelectedItem()=="Ferrari")
                {
                    SportCar Ferrari = new Ferrari(440,0.8,900,260);
                      first= Ferrari;
                }
                if(ChooseYourCar.getSelectedItem()=="Porsche")
                {
                    SportCar Porsche = new Porsche(380,0.9,1000,220);
                     first= Porsche;
                }
                if(ChooseYourCar.getSelectedItem()=="Lamborghini")
                {
                    SportCar Lamborghini = new Lamborghini(440,0.7,900,250);
                    first= Lamborghini;
                }


                if(ChooseOppsCar.getSelectedItem()=="Aston martin")
                {
                    SportCar AstonMartin = new Astonmartin(400,1.0,1200,220);
                    Second= AstonMartin;
                }
                if(ChooseOppsCar.getSelectedItem()=="Audi")
                {
                    SportCar Audi = new Audi(300,1.2,1200,200);
                     Second= Audi;
                }
                if(ChooseOppsCar.getSelectedItem()=="Ferrari")
                {
                    SportCar Ferrari = new Ferrari(440,0.8,900,260);
                      Second= Ferrari;
                }
                if(ChooseOppsCar.getSelectedItem()=="Porsche")
                {
                    SportCar Porsche = new Porsche(380,0.9,1000,220);
                    Second= Porsche;
                }
                if(ChooseOppsCar.getSelectedItem()=="Lamborghini")
                {
                    SportCar Lamborghini = new Lamborghini(450,0.7,900,250);
                    Second= Lamborghini;
                }

                ChooseYourCar.setVisible(false);
                ChooseOppsCar.setVisible(false);

                Commentry.setText("IT IS TIME TO GET THE SIMLATION UNDER WAY, THE TWO CARS HAVE BEEN CHOOSEN AND THERE ATTRIBUTES ARE BELOW.");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Track.setLocation(1, 1);
                Track.setBackground(Color.BLACK);
                Track.setLocation(2, 1);
                Track.setBackground(Color.ORANGE);
                Commentry.setText("THE CARS ARE NOW IN PLACE IN BLACK WE HAVE "+ first.getName()+"\n"+"WHILE OUR OTHER CAR IN ORANGE, WE HAVE "+ Second.getName());
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Commentry.setText("LETS RACE");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Commentry.setText("3");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Commentry.setText("2");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Commentry.setText("1");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Commentry.setText("GO");


                double firstCurrentPosition = (first.getcurrentspeed()+first.getGrip());
                double secondCurrentPosition = (Second.getcurrentspeed()+Second.getGrip());
                if(firstCurrentPosition>secondCurrentPosition){
                    Track.setLocation(1, 1);
                    Track.setBackground(Color.GREEN);
                    Track.setLocation(2, 1);
                    Track.setBackground(Color.GREEN);

                    Track.setLocation(1, 3);
                    Track.setBackground(Color.BLACK);
                    Track.setLocation(2, 2);
                    Track.setBackground(Color.ORANGE);
                   Commentry.setText("WOW "+ firstCurrentPosition+ " "+ secondCurrentPosition);
                  }

        }

        }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
       Track window = new Track();
       window.setDefaultCloseOperation(EXIT_ON_CLOSE);
       window.setSize(750,530);
       window.setVisible(true);
       window.setTitle("Car Race Simulator");


       }


}

1 个答案:

答案 0 :(得分:3)

我很难抓住你的问题,过了一段时间我才明白标题“Java GUI不断崩溃”实际上意味着“Java GUI挂起”。

非常清楚的情况:你在“event2.actionPerformed()”方法中做了太多工作[因为Thread.sleep()调用],所以事件调度线程[也称为EDT]调用了所有侦听器的“actionPerfomed()”方法被阻塞,直到该长时间运行的方法完成。因此,按下StartRace按钮后,GUI会“挂起”!

简单回答:使用SwingWorker(自Java 6以来在Java运行时中可用)!这里有两个很好的例子:

我会更详细地解释对SwingWorker的需求,但在网上已经有很多优秀的解释,例如

PS
更多信息:在工人类中移动长时间运行的代码,例如

    class RaceWorker extends SwingWorker<Void, Void> {
        @Override
        protected Void doInBackground() throws Exception {
            // ... long running code here ...
            return null;
        }
    }

所以“actionPerformed()”方法看起来像是......:

    public void actionPerformed(ActionEvent startrace) {
        new RaceWorker().execute();
    }

PPS
顺便说一句......我预测你很难,不是实现,而是使用代码:例如一旦你尝试从StartWorker访问当前名为“Track”的成员变量,编译器就会将它与“Track”类名混淆,并拒绝编译。我的(未提供的)建议:首先清理方法,变量和成员变量的命名,然后使用SwingWorker进行重构。这样你就可以省下很多时间和麻烦。关于常见Java代码约定的简要概述在这篇关于Naming convention/Java的维基百科文章中,对于你的代码应该足够了[我个人确实使用了“实例变量的下划线”,但这是一个品味和经验问题] 。为了完整起见:“官方”Java代码约定来自Oracle