Java JOptionPane.showInputDialog () вызывается более одного раза, когда код говорит только один раз - PullRequest
0 голосов
/ 19 декабря 2009

Хорошо, я создаю онлайновую файтинговую игру, и диалог, в котором вы вводите IP-адрес сервера, снова и снова выскакивает, хотя код запрашивает его только один раз.Это не в каком-либо цикле, поэтому я не знаю, что происходит.

    public void connectAndInit(){
        try{
            String ip = JOptionPane.showInputDialog("Input server IP.");    
            players = new Player[MAX_PLAYERS];
            players[0] = new Player(25,25,135);
            players[1] = new Player(750,550,315);

            ct = new ClientThread(ip, players);
            ct.start();
            ct.setPriority(Thread.MAX_PRIORITY);

            playerNum = ct.playerNum;

            init = false;
        }

        catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void update()
    {
            if(init)
            connectAndInit();
    }

Вот игра с проблемой: http://prime.programming -designs.com / java / metaship-client.jnlp

А вот сервер, который необходимо запустить перед запуском игры: http://prime.programming -designs.com / java / metaship-server.jnlp

Ответы [ 3 ]

3 голосов
/ 19 декабря 2009

Мне нужно было бы увидеть иерархию классов, чтобы быть уверенным, поскольку я не на 100% знаю, когда и почему вызывается update(), но вот то, что я подозреваю, происходит.

update() вызывается дважды, сначала один раз (когда вы впервые показываете JOptionPane), и снова по какой-то причине. Возможно, когда JOptionPane отображается, уничтожается или вызывает перерисовку в каком-либо другом компоненте.

Гвоздь в том, что, хотя показано, что JOptionPane, выполнение в этом потоке остановлено, поэтому, когда он закрывается, происходит сумасшедшая борьба за потоки выполнения, и connectAndInit() часто (или всегда) вызывается до того, как будет достигнут init=false. Если вызовы update() поступают из разных потоков, это, вероятно, предложение всегда .

Чтобы это исправить, измените код на:

if(init){
  init=false;
  connectAndInit();
}

И обойтись без init=false; в connectAndInit().

0 голосов
/ 19 декабря 2009

Хороший случай для использования вашего отладчика.

В любом случае, я полагаю, что проверяемая переменная инициализации не установлена ​​в другом месте, например отдельной веткой.

0 голосов
/ 19 декабря 2009

Допустим, update() вызывается сто раз за раз в сотне разных потоков. init будет иметь значение true в каждом потоке, поэтому connectAndInit() будет вызываться сто раз, и, таким образом, ваше диалоговое окно будет отображаться сто раз.

Я не уверен, обязательно ли это происходит здесь, но это вполне может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...