Я пытаюсь создать простую сетевую игру tictactoe. Мне нужна программа, чтобы ждать, пока игрок сделает ход, а затем продолжит. В моей функции whileConnected() в нижней части моего кода у меня есть цикл while (true), который должен запускаться вечно и отображать подтверждающее сообщение при нажатии кнопки (что сигнализируется тем фактом, что содержимое строки переменные «сообщения»).Приостановить и дождаться нажатия кнопки, затем продолжить
Проблема в том, что даже если переменная сообщения String изменяется при нажатии кнопки, моя функция whileConnected() никогда не реализует это, а оператор if внутри функции никогда не оценивает значение true. Тождественный оператор if внутри класса ButtonListener отлично работает и отображает желаемое подтверждающее сообщение.
Как я могу решить эту проблему? Я читал и читал, и мне кажется, что я должен использовать Threads (я читал о них, но я никогда не использовал их раньше, вот почему это всего лишь предположение). Нужны ли мне потоки? Может кто-нибудь объяснить вкратце принцип, который следует использовать для этой конкретной проблемы? (как я могу сделать паузу программы до щелчка кнопки, а затем продолжить использование соответствующей информации, созданной при нажатии кнопки). Пример кода действительно облегчит мое чтение о потоках - это действительно абстрактная тема, когда вы новичок.
Ниже мой код, спасибо заранее.
public class Test extends JFrame
{
private Container contentPane;
private JButton btn00;
private static String message = "";
private class ButtonListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
String buttonText = e.getActionCommand();
if (buttonText.equals("My Button"))
{
message = "pressed";
if (message != "")
System.out.println(message+"(executed by ButtonListener)");
}
}
}
public Test()
{
this.contentPane = this.getContentPane();
btn00 = new JButton("My Button");
btn00.setSize(btn00.getPreferredSize());
btn00.setLocation(20,20);
ButtonListener listener = new ButtonListener();
btn00.addActionListener(listener);
// configure frame
this.setSize(300,300);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// make panel
JPanel panel = new JPanel();
panel.setSize(200,200);
panel.setLocation(10,10);
panel.add(btn00);
this.contentPane.add(panel);
}
public static void main(String[] args)
{
Test gui = new Test();
gui.setVisible(true);
// connected
whileConnected();
}
private static void whileConnected()
{
System.out.println("message is at first empty: "+message);
while (true)
{
// the if below never evaluates to true... why?
if (message != "") // this is never true
System.out.println(message+"(executed by whileConnected)");
}
}
}
«Я не удивлюсь, если вы сможете получить больше всего или всего того, что хотите, просто используя хорошо построенных слушателей». Не могли бы вы немного рассказать об этом? (Я ценю детали семафора, но на данный момент это слишком сложно для меня, и это школьный проект, который мне нужно решить довольно скоро, поэтому я с удовольствием займусь самым простым решением прямо сейчас) –
Ну, это звучит как то, что вам нужно, это то, что будет реагировать соответствующим образом на нажатия кнопок. У вас есть прослушиватель кнопок, который выполняет код на основе нажатия кнопок. Вместо того, чтобы что-то выполнять в основной функции, вы могли бы просто сделать все, что вам нужно сделать изнутри слушателей. Имейте в виду, что слушатели работают в том же потоке, что и пользовательский интерфейс, поэтому, если там много обработки, вы можете столкнуться с некоторым неприятным замедлением, но это должно сработать.К сожалению, если ваше название вопроса является прямой цитатой из вашего задания, семафоры, вероятно, то, что они ищут. –
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html может быть полезно здесь, если вам нужно использовать семафоры. –