2013-03-21 3 views
0

Я работаю над проектом, в котором я создаю простую игру Ping Pong. Если игрок побеждает, я бы хотел, чтобы JOptionPane всплыл, спрашивая, хочет ли пользователь играть в новую Игру или перестать играть. Когда я добавляю JOptionPane, метод не ждет, пока пользователь выберет кнопку, но продолжит работу и продолжает создавать JOptionPanes, пока не вернет ошибку переполнения стека. Код, который его контролируетJFrame не ждет выполнения JOptionPane

int rightMinLeft = Right_Player_Score.getNumber()-Left_Player_Score.getNumber(); 
boolean rightWon = Right_Player_Score.getNumber() > 20 && rightMinLeft > 1; 
if(rightWon) 
{ 
    Object[] options = {"New Game", "Finish"}; 
    int i = JOptionPane.showOptionDialog(null, "Right Player has won", "Game Over", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); 
    if(i == 0) 
    { 
    reset(); 
    } 
    else 
    { 
    GameOver = true; 
    } 
} 
else if(Left_Player_Score.getNumber() > 20 && Left_Player_Score.getNumber()-Right_Player_Score.getNumber()>1) 
{ 
    Object[] options = {"New Game", "Finish"}; 
    int i = JOptionPane.showOptionDialog(null, "Right Player has won", "Game Over", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); 
    if(i == 0) 
    { 
    reset(); 
    } 
    else 
    { 
    GameOver = true; 
    } 
} 

Любые предложения?

Edit: Вот полный метод:

public void update(Graphics window) 
{ 
    paint(window); 
} 

public void paint(Graphics window) 
{ 
    try{ 
    if(pause) 
    { 
    Right_Player_Score.draw("Right Player Score", window, 600, 20); 
    Left_Player_Score.draw("Left Player Score", window, 0, 20); 
    leftPaddle.draw(window); 
    rightPaddle.draw(window); 
    if(U.LELatch(keys[4])) 
    { 
     pause = false; 
    } 
    } 
    else 
    { 
    ball.moveAndDraw(window); 
    leftPaddle.draw(window); 
    Right_Player_Score.draw("Right Player Score", window, Color.WHITE, 600, 20); 
    Left_Player_Score.draw("Left Player Score", window, Color.WHITE, 0, 20); 
    int LeftPaddleBottom = leftPaddle.getY()+(leftPaddle.getHeight()); 
    int RightPaddleBottom = rightPaddle.getY()+(rightPaddle.getHeight()); 
    int LeftPaddleTop = leftPaddle.getY(); 
    int RightPaddleTop = rightPaddle.getY(); 
    boolean inRangeLeft = ball.getY() > LeftPaddleTop && ball.getY() < LeftPaddleBottom; 
    boolean inRangeRight = ball.getY() > RightPaddleTop && ball.getY() < RightPaddleBottom; 
    if(ball.getX()<=10) 
    { 
    ball.setXSpeed(-ball.getXSpeed()); 
    Right_Player_Score.increment(); 
    } 
    else if(ball.getX()>=790) 
    { 
     ball.setXSpeed(-ball.getXSpeed()); 
     Left_Player_Score.increment(); 
    } 
    else if((inRangeLeft && ball.getX()<=leftPaddle.getX()+leftPaddle.getWidth())) 
    { 
     ball.setXSpeed(-ball.getXSpeed()); 
     numTimes ++; 
    } 
    else if(inRangeRight && ball.getX()>=rightPaddle.getX()) 
    { 
     ball.setXSpeed(-ball.getXSpeed()); 
     numTimes ++; 
    } 

    if(!(ball.getY()>=10 && ball.getY()<=450)) 
    { 
    ball.setYSpeed(-ball.getYSpeed()); 
    } 

    if(keys[0] == true) 
    { 
    leftPaddle.moveUpAndDraw(window); 
    } 
    else if(keys[1] == true) 
    { 
    leftPaddle.moveDownAndDraw(window); 
    } 
    else 
    { 
     leftPaddle.draw(window); 
    } 
    if(keys[2] == true) 
    { 
     rightPaddle.moveUpAndDraw(window); 
    } 
    else if(keys[3] == true) 
    { 
     rightPaddle.moveDownAndDraw(window); 
    } 
    else 
    { 
     rightPaddle.draw(window); 
    } 
    int rightMinLeft = Right_Player_Score.getNumber()-Left_Player_Score.getNumber(); 
    boolean rightWon = Right_Player_Score.getNumber() > 20 && rightMinLeft > 1; 
    if(rightWon) 
    { 
     Object[] options = {"New Game", "Finish"}; 
     int i = JOptionPane.showOptionDialog(frame, "Right Player has won", "Game Over", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); 
     //window.setColor(Color.BLACK); 
     //window.drawString("Right Player has won",200,400); 
     //Thread.currentThread().sleep(2000); 
     //int i = 1; 
     if(i == 0) 
     { 
     reset(); 
     } 
     else 
     { 
     GameOver = true; 
     } 
    } 
    else if(Left_Player_Score.getNumber() > 20 && Left_Player_Score.getNumber()-Right_Player_Score.getNumber()>1) 
    { 
     Object[] options = {"New Game", "Finish"}; 
     int i = JOptionPane.showOptionDialog(frame, "Left Player has won", "Game Over", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); 
     //window.setColor(Color.BLACK); 
     //window.drawString("Left Player has won",200,400); 
     //Thread.currentThread().sleep(2000); 
     //int i = 1; 
     if(i == 0) 
     { 
     reset(); 
     } 
     else 
     { 
     GameOver = true; 
     } 
    } 
    Right_Player_Score.draw("Right Player Score", window, 600, 20); 
    Left_Player_Score.draw("Left Player Score", window, 0, 20); 
    if(numTimes == 10) 
    { 
     numTimes = 0; 
     if(ball.getXSpeed() == Math.abs(ball.getXSpeed())) 
     { 
     ball.setXSpeed(ball.getXSpeed() + 1); 
     } 
     else 
     { 
     ball.setXSpeed(ball.getXSpeed() - 1); 
     } 
     if(ball.getXSpeed()>MAXSPEED) 
     { 
     ball.setXSpeed(MAXSPEED); 
     } 
    } 
    pause = U.LELatch(keys[4]); 
    } 
    } 
    catch(Exception e) 
    { 
    } 
} 

Это используется в "открытом классе GUI_Controller расширяет Canvas реализует KeyListener, Runnable"

Примечания: комментируемые части являются затычкой способом получения пользователь, по крайней мере, что-то видит.

+0

Не могли бы вы высказать больше своего кода (по крайней мере, полный метод)? Вызов 'JOptionPane.showOptionDialog()' должен блокироваться, поэтому возможно, что ваша проблема лежит за пределами этого фрагмента кода. –

+0

Ваш код картины неправильный. Код основан на приложении AWT, и вы пишете приложение Swing. – camickr

+0

Не могли бы вы рассказать? – RufusBarbarrossa

ответ

2

Поведение, которое вы видите, связано с тем, что вы перегружаете метод paint(Graphics g).

От paint(Graphics g) JavaDoc

Этот метод вызывается, когда содержание компонента должны быть окрашены; такой как , когда компонент сначала отображается или поврежден и нуждается в ремонте .

В вашем случае, то, что, скорее всего, происходит это вызов JOptionPane.showOptionDialog() приводит к JDialog показывая над Canvas который запускает еще один вызов paint(). Это, в свою очередь, вызывает другой вызов JOptionPane.showOptionDialog(), вызывающий другой вызов paint() и т. Д. Это будет продолжаться до тех пор, пока вы не получите StackOverflowError или OutOfMemoryError.

На практике, paint() вызывается довольно часто, поэтому он должен быть очень эффективным. Обычно только ваш пользовательский чертеж должен быть выполнен в методе paint().

Другая логика должна жить по-разному. Вы должны переместить логику для вашей оценки и взаимодействия с пользователем за пределами метода paint() и оставить только чертеж на месте.

Edit: Не видя больше кода, который я не могу дать вам конкретные рекомендации о том, где, чтобы переместить логику, которая не непосредственно занимается живописью. Вам может быть полезно ознакомиться с разделом Java Swing tutorial на странице Performing Custom Painting.

+0

Спасибо! Я попробую это, как только у меня будет время вернуться на мой ноутбук – RufusBarbarrossa

+2

+1, OP использует стиль рисования AWT для приложения Swing, что не очень хорошая идея. Пользовательская покраска должна выполняться на JPanel (или JComponent), переопределяя метод paintComponent() ', а затем добавляем панель в фрейм. Как уже упоминалось, в уроке Custom Painting показано, как это сделать. – camickr

+0

Пробовал, и он работает. Благодаря! – RufusBarbarrossa

0

Возможно, это даст JOptionPane ваш текущий кадр в качестве первого параметра вместо null.

+0

Пробовал это, но он все еще имеет такое же поведение.Единственное отличие состоит в том, что JOptionPane теперь находится в центре JFrame, а не на экране – RufusBarbarrossa

+0

И панель параметров отображается правильно? – MalaKa

+0

Да. Он просто перерисовывается несколько сотен раз – RufusBarbarrossa

Смежные вопросы