2009-03-16 2 views
3

У меня есть 2 класса для игры, которую я делаю,Дизайн класса

gui класс и класс логики, для игры с нотами и крестами. Класс GUI имеет метод, который использует массив JButtons и возвращает их все с одним и тем же анонимным внутренним прослушивателем действий класса

Проблема заключается в том, что при нажатии кнопки я хочу, чтобы текст изменился на x или ao-зависимую на проигрывателе 1 или 2, но этот код должен быть в логическом классе, поэтому не нужно так делать, чтобы я делал метод в логическом классе и вызывал его из-за прослушивателя действий внутри обычного класса метода кнопки make. Однако логика класс не должен иметь ссылку на графический интерфейс, а графический интерфейс имеет ссылку на логическом класс,

я не могу думать о приличном решении этой

благодаря

ответ

1

возможно использовать событие , Таким образом, вы можете отреагировать на сторону GUI вычислений логики и просто выполнить команду:)

+0

Извините, как вы имеете в виду событие, есть ли лучший способ объяснить это или, возможно, связать меня с учебником о том, что вы имеете в виду? – 2009-03-16 10:52:59

+0

Документация Sun о событиях: http://java.sun.com/docs/books/tutorial/uiswing/events/index.html Я не программист на Java, поэтому у меня нет кода для публикации в качестве примера , – Sascha

0

Использование того же экземпляра, что и прослушиватель действий для нескольких кнопок, - это, безусловно, плохая идея. Используйте отдельный экземпляр того же класса реализации, который параметризируется с положением кнопки. Затем слушатель может вызвать модель с использованием интерфейса, подходящего для модели.

0

Если вы сконцентрированы на дизайне (это звучит как домашнее задание), вы можете попробовать MVC (Model-View-Controller).

В этом случае

model = game logic, rules (fire events when things change) 
    gui = (in this case and many swing apps) is both view and controller. Manipulates the model (control) and the model fires events back to update the widgets (view) 
0

Я не считаю, что двунаправленная ссылки (GUI имеет отношение модели и наоборот) должно быть проблемой. Я думаю, что то, что вы ищете, - это подход MVC (Model-View-Controller). Я не знаю, какой язык программирования вы используете для программирования этой игры, и использовать ли этот подход в этом контексте. Я написал небольшую демонстрацию подхода MVC в Java: http://blog.js-development.com/2008/03/logical-separation-with-mvc.html

Возможно, это поможет вам, дайте мне знать.

0

Когда щелчок кнопки происходит, ваш графический интерфейс вызывает логику, чтобы сообщить ему, что текущий игрок (логика знает текущего игрока) где-то щелкнул по сетке. Затем логика обновляет состояние (обновляет сетку, обновляет текущий проигрыватель, ...) и отправляет событие обратно в графический интерфейс, чтобы сообщить графическому интерфейсу, который он должен обновить.

GUI «знает» о логике для вызова операций. Чтобы избежать логики от знания GUI и хорошего разделения проблем, логика должна быть связана с графическим интерфейсом через шаблон Observer, а не с логикой, вызывающей GUI напрямую. GUI прослушивает события из логики. Затем логика динамически связана с графическим интерфейсом, что не является проблемой.

3

Рассмотрим следующий эскиз классов:

public class Game{ 
    public void switchPlayer(){ 
     // among other things calls all GameListeners 
    } 
    public void setMarker(int x, int y); 

    public Player getCurrentPlayer(); 
    public Player getPlayerOwningField(int x, int y); 

    public void registerGameListener(GameListener l); 
} 

public interface GameListener(){ 
    void gameChanged(Game g) 
} 

public class GUI implements GameListener(){ 
    private Game game; 
} 

Когда поле нажата, game.setMarker (х, у) называется. Игра знает, кем является текущий игрок, поэтому он может пометить поле как можно скорее. Он также активирует событие GameChanged. Во время настройки приложения gui должен зарегистрироваться или зарегистрироваться в качестве GameListener в игре. Поэтому он также получит информацию. Он использует геттеры игры для обновления gui. Готово.

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

-2

сохранить флаг события в базе данных или в. так и запросить этот флаг в вашем gui работает как async. события

+0

Приложите больше усилий в следующий раз, D +. – CiscoIPPhone

0

Вы можете применить шаблон MVC.

Класс UI (контроллер) отправит сообщение в класс Logic (Model), в котором будет обновлен вид (класс). Вы должны определить это. Это может быть так же просто, как массив логических значений.

Код пользовательского интерфейса должен будет прочитать класс View, чтобы изменить текст в кнопках. Таким образом, когда View изменен, вам нужно отправить сообщение «invalidate» в UI-класс, чтобы текст кнопок был обновлен.

Ключевым моментом здесь является то, что код пользовательского интерфейса обращается к объекту View для визуализации кнопок. Совершенно верно, что класс UI должен читать этот объект и логический класс для его записи.