Java Swing устарел. Не настолько, чтобы стать ненужным, и не так, чтобы с ним было бы невозможно написать хороший интерфейс. Но он устарел достаточно, чтобы программирование интерфейсов стало рутинным и утомительным процессом. Таблицы используются часто, даже очень. Для создания кастомной модели реализуется интерфейс javax.swing.table.TableModel или (чаще) наследуются от javax.swing.table.AbstractTableModel. Но каша из столбцов, констант, индексов и наименований столбцов превращает поддержку модели в ад. Самой ненавистной мною частью является хранение наименований и типов классов в отдельных переменных. Такое можно увидеть и в официальной документации:
class MyTableModel extends AbstractTableModel {
private String[] columnNames = ...//same as before...
private Object[][] data = ...//same as before...
...
}
Из-за этого в других частях кода я часто вижу использование неименованных индексов столбцов и сравнение их по имени. Вот вам совет: используйте перечисления для работы с колонками таблицы:
public enum IntegerFormatColumns {
/**
* Значение, как оно есть.
*/
SIMPLE {
@Override
public Object getValue(Integer i) {
return i;
}
// переопределяем тип возвращаемого значения
@Override
public Class<?> getColumnClass() {
return Integer.class;
}
},
/**
* Шестнадцатиричное представление числа.
*/
HEX {
@Override
public Object getValue(Integer i) {
return Integer.toHexString(i);
}
},
/**
* Двоичное представление числа.
*/
BINARY {
@Override
public Object getValue(Integer i) {
return Integer.toBinaryString(i);
}
}
;
/**
* Метод, который извлекает показываемое значение из исходных данных
* @param i исходные данные
* @return отображаемый в таблице результат
*/
public abstract Object getValue(Integer i);
/**
* Метод извлечения названия столбца таблицы.
*
* Для примера название извлекается из именования элемента перечисления.
*
* @return название столбца таблицы.
*/
public String getColumnName() {
return name();
}
/**
* Метод извлечения класса отображаемого результата.
*
* По умолчанию, это класс {@link String}.
*
* @return класс отображаемого результата
*/
public Class<?> getColumnClass() {
return String.class;
}
}
Используем этот класс в модели:
public static class IntegerFormatModel extends AbstractTableModel {
private final List<Integer> values = new ArrayList<>();
@Override
public int getRowCount() {
return values.size();
}
@Override
public int getColumnCount() {
return IntegerFormatColumns.values().length;
}
@Override
public String getColumnName(int column) {
return IntegerFormatColumns.values()[column].getColumnName();
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return IntegerFormatColumns.values()[columnIndex].getColumnClass();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return IntegerFormatColumns.values()[columnIndex].getValue(values.get(rowIndex));
}
}
Бесплатно вы получите возможность добавлять/изменять/удалять столбцы без вмешательства в саму модель и простой способ получения индекса столбца:
Каждый, кто начинает обрабатывать цифровые изображения, видел или работал с этой фотографией:
Девушку на фотографии зовут Лена Сёдерберг, а вот перевод статьи с историей её появления в научных статьях:
Изображение Лены (Lena или Lenna) — одно из наиболее часто используемых в алгоритмах сжатия стандартных тестовых изображений. Сайт comp.compression FAQ сообщает следующее:
Для любопытных: «Лена» или «Ленна» — оцифрованный разворот Плейбоя ноября 1972 года. (Ленна — имя, использованное в Плейбое, Лена с одной «н» — шведское имя.) Лена Сёдерберг (Lena Soderberg) по последним сведеньях живёт в её родной Швеции, счастлива замужем, имеет 3-х детей и работу в региональной алкогольной монополии. В 1988 её впервые опрашивали несколько шведских изданий, связанных с компьютерными технологиями, и её приятно повеселило, что случилось с её фотографией. Тогда она впервые узнала об использовании фотографии в сфере компьютерных технологий.
Почитайте чудесную статью в Newsletter от мая 2001 за авторством Джейми Хатчинсон на IEEE Professional Communication Society, если хотите знать больше. Вот небольшая выдержка:
Александр Савчук рассказывает, что был июнь или июль 1973, когда он, будучи ассистентом профессора электроинженерии в институте обработки сигналов и изображений (USC SIPI), спешно искал в лаборатории хорошее изображение для сканирования в статью своего коллеги на конференцию. Они просмотрели их набор стандартных тестовых изображений, но хотелось чего-нибудь отпечатанного на глянцевой бумаге журнала, чтобы быть уверенными в хорошем динамическом диапазоне выходного изображения; и им нужно было лицо. Именно тогда, кто-то зашёл с последним выпуском Плейбоя.
Инженеры оторвали верхнюю треть разворота, чтобы она могла поместиться вокруг барабана их сканера широкоформатных изображений, подсоединённого к установке из аналогово-цифровых преобразователей (по одному на красный, зелёный и синий каналы) и миникомпьютера Hewlett Packard 2100. Сканер имел фиксированное разрешение в 100 линий на дюйм, и, поскольку инженеры хотели получить изображение размером 512 на 512 точек, они ограничили сканирование в 5.12 дюймов, чего хватило для оцифровки разворота вплоть до плеч модели.
На протяжении многих лет шли дискуссии об использовании этого изображения. Часть экспертов предлагали запретить использование этого изображения из-за его происхождения. Помимо этого Плейбой угрожал судебными разбирательствами за несанкционированное использование изображения. Почитайте об этом в редакторской статье журнала SPIE инженеров оптики или в записке бывшего главного редактора в соглашении об обработке изображений IEEE. Согласно Wired Magazine, Плейбой прекратил преследование за нарушения прав использования этого изображения, но по-прежнему остаётся их владельцем.
Ещё один любопытный факт о выпуске с Леной (Мисс Ноябрь 1972) — это самый продаваемый выпуск за всю историю Плейбоя (продано 7 161 561 копий).
А в мае 1997 года Лена присутствовала на юбилейной конференции IS&T (50 лет) и вот как это прошло.
«Учил, но забыл»: ошибочное и истинное знание
Как понять, усвоил ученик материал, или просто обладает иллюзией знания? А главное, как сделать так, чтобы он сам научился различать эти вещи?
Во время отпуска я наконец-то принялся за дела, которые долго откладывал. Совсем недавно я сделал Эмодзи Клипборд ???, а сегодня закончил обновлять дизайн сайта. Внешне, он, конечно, мало изменился, но внутри теперь соответствуют моим требования. Например, у меня нестандартная главная страница, и иногда я меняю на ней фотографию, автора фотографии и приветственное сообщение. Менять это на адаптированной теме Spacious Pro было муторно и долго, и я страдал.
Среди прочих требований были и такие:
изменить адаптивное меню для мобильных устройств;
иметь отдельные категории записей: галерею, как у лучших фотографов, короткие сообщения большими буквами, как на Хабре, посты-ссылки;
просматривать фотографии в полном размере, не уходя со страницы;
создавать целые страницы проектов без использования поддомена (сравните: apps.markoutte.me/emoji и markoutte.me/projects/emoji);
создавать страницы-документы, которые можно тут же распечатать (так сделана страница контактов и резюме);
изменять главную страницу через настройки темы.
Вордпрес-тему, которая была написана за чистые 40 часов работы (~3 дня), я назвал Waistcoat и никуда не выложил:
А теперь полезные материалы, сниппеты и ссылки, которые мне очень пригодились.
1. WordPress Theme Development плейлист на ютубе
Вордпрес написан на php, поэтому и разрабатывать тему придётся на этом языке. Опыт использования этого языка у меня был после работы с организаторами Правобереги. На деле, написать тему с имеющимися у меня знаниями оказалось нетрудно. Этот видеокурс помог мне быстро разобраться, что к чему:
2. CSS-фреймворк для красивой разметки
Вы бы выбрали бутстрап? Я — нет. На носу 4-я версия, которая на текущий момент имеет номер сборки v4.0.0-alpha.6. Не хочется использовать у себя проект, находящийся на этапе постоянных доработок и исправлений. Перспективы обновлять тему, когда выйдет новая версия, не привлекают. Использовать 3-ю версию уже нет смысла, поскольку после выхода 4-й я буду облизываться на новый функционал и снова буду переписывать тему. Проблем слишком много, поэтому я просто взял Kube, который мне почти не пришлось допиливать напильником, за что им огромное спасибо.
3. jQuery и плагины
Kube использует jQuery. И тут я совершенно с ним согласен. Что касается современных лайтбоксов (просмотр фотографии поверх затемнённой страницы), то тут меня ждало разочарование — все хорошие реализации стоят денег, причём зарубежных. Хотя один свободный я всё-таки нашёл, и Chocolat радует меня возможностями, внешним видом и простотой в использовании.
4. Расширение функциональности Вордпреса
Для некоторых функциональных задач хочется иметь специфичные вещи. Вот некоторые, упростившие мою жизнь:
Итог
Радости моей нет предела. Давно я не сидел с утра до ночи, увлёкшись конкретной целью. Теперь приятно иметь контроль над внешним видом сайта и использовать полезные функциональные возможности.