0

Hey Guys は、私のコードで発生したこの Java の問題についてあなたの助けが必要です。私は基本的にカー レース シミュレータとして使用されている GUI を作成しました。レース、ivはレースの最初の部分だけを行いましたが、うまくいかなかったので、先に進む前に問題を修正したいと思います. 説明するのは難しいですが、コードを表示する方が簡単です(以下にあります)。もっと私が書こうとしていることを言うことができます。私は問題が何であるかについて傾向がありません。私がそれをデバッグすると(Eclipse IDEを使用しているように)、機能しない部分は単にウィンドウ全体を黒くし、約1分間何も表示されず、ほとんどのコードをスキップし、残りのことさえしません。さらに情報が必要な場合は、私に尋ねてください。私は多くのクラスを持っていますが、それらはおそらく皆さんをより混乱させるので、私が問題を抱えているクラスだけを貼り付けてください.

(注: SportCar- は 5 つのサブクラス (Astonmatin、Audi、Ferrari、Porsche、Lamborghini) を持つスーパー クラスです)

(注: Track は、GUI インターフェイスを備えた独自のクラスであり、大きなクラスであり、SportsCar とそのサブクラスの変数とメソッドを使用します。すべてのメソッドと変数は問題ではありません)

(注: 問題は 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");


       }


}
4

1 に答える 1

3

あなたの質問をつかむのは非常に困難でしたが、しばらくして、「Java GUI がクラッシュし続ける」というタイトルが実際には「Java GUI がハングする」という意味であることがわかりました。

非常に明確なケース: 「event2.actionPerformed()」メソッドで [Thread.sleep() 呼び出しのため] あまりにも多くの作業を行っているため、イベント ディスパッチ スレッド [EDT とも呼ばれる] が「actionPerfomed( )" すべてのリスナーのメソッドは、長時間実行されるメソッドが完了するまでブロックされます。したがって、StartRace ボタンを押した後、GUI がしばらく「ハング」します。

簡単な答え: SwingWorker (Java 6 以降の Java ランタイムで利用可能) を使用してください! ここに 2 つの良い例があります。

SwingWorker の必要性をもっと詳しく説明したかったのですが、Web 上にはすでに多くの優れた説明があります。

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
ところで...実装ではなく、コードで非常に苦労すると思います。たとえば、現在「Track」という名前のメンバー変数に StartWorker からアクセスしようとすると、コンパイラは混乱します。 「Track」クラス名を使用すると、コンパイルが拒否されます。私の (聞かれていない) アドバイス: 最初にメソッド、変数、およびメンバー変数の命名をクリーンアップし、その後 SwingWorker でリファクタリングを行います。このようにして、多くの時間と手間を節約できます。通常の Java コード規則に関する簡潔な概要は、名前付け規則/Javaに関するウィキペディアの記事にあり、コードには十分なはずです [私は個人的に「インスタンス変数にアンダースコアを使用しますが、これは好みと経験の問題です]。完全を期すために:「公式」オラクル

于 2013-03-20T08:42:26.143 に答える