1

マルチスレッドの問題に関連する投稿は既にありますが、新しい質問とコードがいくつかあります。マルチボール ゲーム プロジェクトがあり、XML ファイルを解析してボールに関する情報 (サイズ、速度、初期位置など) を取得する必要があります。ここで、XML ファイルを解析する別のスレッドを作成したかったのですが、その方法がわかりません。これが私のコードです:

main() はここから始まります:

public class BounceBallApp extends JFrame{

    public BounceBallApp()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("BounceBallApp");          
        setSize(300,300);       
        setVisible(true);
        add(new BallWorld());
        validate();
    }

    public static void main(String[] args) 
    {
        /*Create main GUI in the Event Dispatch Thread*/
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new BounceBallApp(); //main frame
            }
        });

    }
}

BallWorld() のコンストラクター内に、[開始] ボタンを含む内部クラス BallContainer() があります。

jbtStart.addActionListener(new ActionListener()
            {public void actionPerformed(ActionEvent e)
            {
                //Populate the ballList arraylist
                if(filePathField.getText().equals(" "))
                {
                    JOptionPane.showMessageDialog(null, "Please input the XML file","Information", JOptionPane.INFORMATION_MESSAGE);        
                }
                else
                {
                    XMLFilePath = filePathField.getText();

                    ballList = new BallList(XMLFilePath);//I want to put this in a thread
                    JOptionPane.showMessageDialog(null,"Game started!","Bouncing Balls",JOptionPane.INFORMATION_MESSAGE);
                    for(Ball ball:ballList.ballsArrayList) 
                    {
                        timer.setDelay(1000/ball.getSpeed()); //change the delay of the timer to the ball's speed
                        timer.start(); //start the timer
                        bTimer = true; //timer is now on                    
                    }
                }

            }
            });

        }

問題は、解析プロセスを別のスレッドに置くと、アプリケーションを続行する前に、ballsArrayList がいっぱいになるのを待たなければならないことです。invokeAndWait() を使用することを考えていましたが、そのメソッドはイベント ディスパッチ スレッドから呼び出すことはできないと読みました。それで、どうすればこれを達成できますか?それとも価値がありますか?また、ボールを動かす計算(x,y座標の計算)をスレッドに移したかったのですが、やはり実装方法がわかりません。

for(Ball ball:ballList.ballsArrayList) 
            {
                ball.draw(g);                   
                ball.move(ballContainerWidth,ballContainerHeight,buttonPanel.getHeight());                  
            }

public void move(int ballContainerWidth,int ballContainerHeight,int buttonPanelHeight)
 {

     if((this.getX()+this.getsize()+this.getDx()) > ballContainerWidth) 
        {
            this.setDx(-Math.abs(this.getDx()));
        }

        //the height/depth to which the balls can bounce is the (main ball container height) minus (button panel height)
        if((this.getY()+this.getsize()+this.getDy()) > ballContainerHeight-buttonPanelHeight) 
        {
            this.setDy(-Math.abs(this.getDy()));
        }

        if((this.getX()-this.getsize()) < 0 )
        {
            this.setDx(Math.abs(this.getDx()));
        }

        if((this.getY()-this.getsize()) < 0 )
        {
            this.setDy(Math.abs(this.getDy()));
        }


        int newX = (int)Math.round((this.getX()+this.getDx()));
        int newY = (int)Math.round((this.getY()+this.getDy()));
        this.setX(newX);
        this.setY(newY);
 }

長い投稿で申し訳ありませんが、マルチスレッドは私にとってまったく新しいものです。私はそれについて少し混乱しています。

4

1 に答える 1