Я не проверял это, но я не могу прикрепить событие к некоторой анимации.
Я думаю, вы должны сделать это следующим образом
btn1 нажал кнопку вызова function1 function1: запустить анимацию 1 на 2 с после вызова 2s function2 (пользователь setTimeout)
function2: запустить анимацию 2 на 1 с после вызова 1 с некоторая другая функция
Мне настраивали шаблон в Eclipse так, чтобы я только ввел часть объявления, и затем Eclipse автоматически заполнит остальных для меня.
${:import(org.apache.log4j.Logger)}
private final static Logger log = Logger.getLogger(${enclosing_type}.class);
${cursor}
Так, я только имею к типу logger
, совершаю нападки Ctrl+Space
, сопровождаемый Enter
, и Eclipse заполняет остальных для меня и добавляет объявление импорта также.
Это не сократит объем шаблонного кода, но по крайней мере он сокращает объем нажатий клавиш.
Взгляните на использование точки, включает Ваш код
, я не оглянулся назад начиная с использования их с пружиной.
Вот статья об использовании AspectJ
Вам не нужен getName () при использовании 1.2 +, версия log4j, getLogger () принимает аргумент Класса. Но что касается остальных, нет никакого пути вокруг этого, если Вы хотите, чтобы каждый класс имел статического участника журнала со своей собственной категорией.
В зависимости от Ваших потребностей входа Вы могли создать класс "LoggingService" со статическими методами для входа к различным "каналам". Я нашел, что мне действительно не нужна регистрирующаяся гранулярность вниз к уровню класса. Можно назвать регистраторы что каждый работы лучше всего для Вас. Мы использовали это в больших, корпоративных приложениях в течение нескольких лет, и гранулярность действительно не была проблемой для нас.
сервис входа, инициализированный в статическом блоке инициализатора... так для входа сообщения:
LoggingService.logError ("вздор");
Никакой шаблонный код в каждом классе.
Вот сервис входа в качестве примера:
public class LoggingService {
/**
* A log for informational messages.
*/
static private Logger infoLog;
/**
* A log for data access messages.
*/
static private Logger dataAccessLog;
/**
* A log for debug messages.
*/
static private Logger debugLog;
/**
* A log for error messages.
*/
static private Logger errorLog;
/**
* A log for all XML related messages.
*/
static private Logger xmlLog;
/**
* A log for all trace messages.
*/
static private Logger traceLog;
/**
* A log for all warning messages.
*/
static private Logger warnLog;
static {
//This is the bootstrap for the logging service.
//Setup each logger
infoLog = Logger.getLogger("com.company.logging.info");
dataAccessLog = Logger.getLogger("com.company.logging.dataaccess");
debugLog = Logger.getLogger("com.company.logging.debug");
errorLog = Logger.getLogger("com.company.logging.error");
xmlLog = Logger.getLogger("com.company.logging.xml");
traceLog = Logger.getLogger("com.company.logging.trace");
warnLog = Logger.getLogger("com.company.logging.warn");
// This must be set so isErrorEnabled() will work.
errorLog.setLevel(Level.ERROR);
warnLog.setLevel(Level.WARN);
}
static public void logDataAccess(String pMessage) {
dataAccessLog.info(pMessage);
}
static public void logInfo(String pMessage) {
infoLog.info(pMessage);
}
static public void logDebug(String pMessage) {
debugLog.debug(pMessage);
}
static public void logTrace(String pMessage) {
traceLog.debug(pMessage);
}
static public void logWarn(String pMessage) {
warnLog.warn(pMessage);
}
static public void logError(String pMessage) {
errorLog.error(pMessage);
}
static public void logError(String pMessage, Throwable pThrowable) {
errorLog.error(pMessage, pThrowable);
}
static public void logXml(String pMessage, XmlBean pContainer) {
if (!xmlLog.isInfoEnabled()) return;
xmlLog.info(pMessage + " : " + JAXBHelper.marshal(pContainer));
}
static public boolean isInfoEnabled() {
return infoLog.isInfoEnabled();
}
static public boolean isDataAccessEnabled() {
return dataAccessLog.isInfoEnabled();
}
static public boolean isDebugEnabled() {
return debugLog.isDebugEnabled();
}
static public boolean isErrorEnabled() {
if (errorLog.getLevel().toInt() >= Level.ERROR_INT) {
return true;
}
return false;
}
static public boolean isTraceEnabled() {
return traceLog.isDebugEnabled();
}
static public boolean isXmlEnabled() {
return xmlLog.isInfoEnabled();
}
static public boolean isWarnEnabled() {
return warnLog.isEnabledFor(Level.WARN);
}
}
Если Вы идете для регистраторов уровня пакета с добавлением шаблонного класса на пакет, можно записать:
private static final Logger log = Logs.log;
существуют взломы для чтения имени класса вызывающей стороны (на самом деле, регистрирующаяся реализация имеет взлом для обнаружения существующего метода), но я не рекомендовал бы это.
На самом деле обычная практика использования имен классов для названий регистратора является ленивыми больше, чем что-нибудь.
Намного лучшая практика должна назвать регистраторы контекстом задачи. Это включает несколько больше мыслительного процесса и планирования, но в конце, результатом является намного больше meanigful гранулярности, где можно переключить регистрирующиеся уровни для фактических задач, а не классов.
Вы можете стенография это крошечный бит, поскольку getLogger перегружается к также, просто посещают урок. Как так:
public class MyClass {
private static Logger _log = Logger.getLogger(MyClass.class);
}
Регистратор может быть как fleixble или негибок, поскольку Вы хотите, чтобы он был. Можно захватить новый регистратор для каждого класса, как в примере выше, и иметь иерархию регистраторов, где можно управлять и стать включения - выключения вход классом. Или если Ваш проект является маленьким или прототип, и т.д., Вы могли бы просто назвать Logger.getRootLogger () - но Вы потеряете гибкость подстройки, что Вы регистрируете и не регистрируете. У Вас мог быть базовый класс, где регистратор живет, и сделайте, чтобы все назвали тот, но снова, Вы теряете некоторую гибкость:
public class MyBase {
protected static Logger _log = Logger.getLogger(MyClass.class);
}
public class MyClass extends MyBase {
....
_log.info("Stuff....");
}
Нижняя строка, если Вы хотите сохранить способность подстроить, настраивает Ваш вход позже в проект (включите более прекрасную отладку уровня всего для одного класса), тогда Вам, вероятно, придется придерживаться шаблона в каждом классе.
При создании регистратора нестатичным можно, по крайней мере, наследовать его:
public class SomeBaseClass
{
protected Logger logger = Logger.getLogger(getClass());
}
public class SubClass extends SomeBaseClass
{
public void doit() { logger.debug("doit!!!!"); }
}
Это - то, как я всегда делал это.