2016-02-16 6 views
0

Я хочу, чтобы разрешить изменение различных кнопок событий в Java:Как обрабатывать большое количество различных команд кнопок?

У меня есть десяток различных кнопок, которые будут делать различные действия. Все вместе, как будто у меня есть от 40 до 50 кнопок или от 40 до 50 различных возможных команд.

Тогда у меня есть много параметров, называемых a..z и A..Z. Каждое событие Button приведет к увеличению некоторых параметров, например:
button#1 будет увеличить a, b, c и u.
Button#2 будет увеличить f и y.
Button#5 будет увеличить AFG и el.

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

Таким образом, мне нужно

  1. Как-то сказать, моя модель, чтобы увеличить кучу параметров НЕ путем вызова .increaseA(); .increase_x(); .increaseWhatever(); для каждого возможного параметра.

  2. Помните и инвертировать обработанные команды, относительно повышенными параметрами (которые могут изменяться по типу и количеству)

Обычно Command-Pattern был бы мой выбор для Undo-Options , но здесь я бы получил более 50 разных классов, потому что каждая команда увеличивала бы разные параметры, даже если фактическая операция одинакова: увеличивая параметры.

Я был бы признателен, если бы кто-нибудь мог показать мне очень чистое решение.


Мой подход до сих пор был бы смешивать шаблон Command с каким-то Струнным-парсером: Используя HashMap, содержащей кнопку-идентификатор в качестве ключа, и строка, состоящая из параметров должны быть увеличена, как ценность. Например: <button1, "abcefgWY+1"> Тогда мне понадобится только моя модель с парсером String, которая разрешит эту команду ... но это не решает проблему UNDO, и я спрашиваю, является ли это хорошим подходом?

ответ

0

Что касается наличия хэш-функции из целых чисел с соответствующей буквой в качестве ключа, а значением является фактическое значение, подобное этому myIntegers<Character, IntegerValue>.

<button1, "abcedgWY"> может быть чем-то более похож на <buttonX, buttonObject> где объект кнопки - это массив символов и счетчик для того, сколько раз увеличивается инкремент, чтобы вы знали, сколько декрементов разрешено. Пройдите через свой массив символов, используя каждый символ в качестве ключа для hashmap myIntegers и увеличения или уменьшения на кнопку или вариант отмены.

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

+0

Спасибо за ответ. Когда я буду нажимать кнопку 1, например, символы abc, а затем нажмите кнопку2, увеличив afg, затем кнопка 3 с bhj ... не отменит от кнопки 3, а также не уменьшит символы из кнопки2 (слишком рано)? (Потому что вы сказали, что я вижу, возможно ли отменить в зависимости от счетчика). Мне нравится идея с помощью Hashmap и использование Stack for undo (который я уже рассмотрел) хотя :) Я должен был упомянуть, что нельзя нажимать одну и ту же кнопку несколько раз подряд. – ElectRocnic

+0

, если вы управляете вызовами отмены только через всплывающее окно, вам вообще не нужно беспокоиться о заказе. Я больше интересовался тем, как ваш вариант отмены отображается пользователю. В вашем последнем комментарии нажатие 1, 2, 3 и отмена 3 будет в порядке. Но если вы показываете кнопки отмены, которые включены без предварительной проверки кнопки buttonObject, чтобы увидеть, была ли она увеличена, тогда у вас будет проблема с уменьшением. – essa

0

вы ищете фасад дизайна картины ...

там вы можете создать свой собственный суб-команд ...

, но когда дело доходит до кодирования, вы можете помочь с более простое решение, по желанию вы звоните фасад-Methode:

private void increaseAllOf(String whichOne, int amount) { 

    for (char c: whichOne.toCharArray()){ 
     switch(c){ 
     case 'a' : {increaseWhereElse(amount);break;} 
     case 'b' : {increaseOnOtherPlace(amount);break;} 

     } 
    } 

} 

вы можете определить в распределительном-заявление, в котором метод будет вызываться, в зависимости от характеров whichOne -String

+0

Я бы поднял, если бы мог (недостаточно репутации)! Спасибо! Это не общее решение, но помогает многое наверняка :) – ElectRocnic

+0

спасибо, если я могу предоставить дополнительные идеи, дайте мне знать =) –