GUI в Scala / Groovy / Clojure

ПРОБЛЕМА:

Прежде всего, вы, кажется, не говорите о кириллических персонажах, а о центральных и восточноевропейских языках, которые используют латинский алфавит. Взгляните на разницу между кодовой страницей стр. 1250 и код страницы 1251 , чтобы понять, что я имею в виду. [ПРИМЕЧАНИЕ. Я обновил вопрос, чтобы он говорил о чешских персонажах, а не кириллице.]

Второе наблюдение. Вы пишете код, содержащий специальные символы:

"Testing of letters Č,Ć,Š,Ž,Đ"

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

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

"Testing of letters \u010c,\u0106,\u0160,\u017d,\u0110"

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

Ваша третья ошибка что вы предполагаете, что Helvetica - это шрифт, который знает, как рисовать эти глифы. Это ложное предположение. Вы должны использовать файл шрифта, такой как Arial.ttf (или выбрать любой другой шрифт, который знает, как рисовать эти глифы).

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

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

РЕШЕНИЕ:

Я написал небольшой пример, названный CzechExample что приводит к следующему PDF: czech.pdf

enter image description here [/g8]

Я добавил тот же текст дважды, но используя другой encoding:

public static final String FONT = "resources/fonts/FreeSans.ttf";
public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(DEST));
    document.open();
    Font f1 = FontFactory.getFont(FONT, "Cp1250", true);
    Paragraph p1 = new Paragraph("Testing of letters \u010c,\u0106,\u0160,\u017d,\u0110", f1);
    document.add(p1);
    Font f2 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, true);
    Paragraph p2 = new Paragraph("Testing of letters \u010c,\u0106,\u0160,\u017d,\u0110", f2);
    document.add(p2);
    document.close();
}

Чтобы избежать вашей третьей ошибки, я использовал шрифт FreeSans.ttf вместо Helvetica. Вы можете выбрать любой другой шрифт, если он поддерживает символы, которые вы хотите использовать. Чтобы избежать вашей четвертой ошибки, я установил параметр embedded в true.

Что касается вашей пятой ошибки, я ввел два разных подхода.

В первом случае, Я сказал iText использовать кодовую страницу 1250.

Font f1 = FontFactory.getFont(FONT, "Cp1250", true);

Это вложит шрифт в качестве простого шрифта в PDF, что означает, что каждый символ в вашем String будет представленный с использованием одного байта . Преимущество такого подхода заключается в простоте; недостатком является то, что вы не должны начинать смешивать кодовые страницы. Например: это не будет работать для кириллических символов.

Во втором случае я сказал iText использовать Unicode для горизонтальной записи:

Font f2 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, true);

Это вложит шрифт как композитный шрифт в PDF, что означает, что каждый символ в вашем String будет представлен с использованием более одного байта . Преимущество такого подхода заключается в том, что это рекомендуемый подход в новых стандартах PDF (например, PDF / A, PDF / UA) и что вы можете смешивать кириллицу с латинским, китайским и японским и т. Д. Недостатком является то, что вы создайте больше байтов, но этот эффект ограничен тем, что потоки контента все равно сжаты.

Когда я распаковываю поток контента для текста в примере PDF, я вижу следующий синтаксис PDF:

enter image description here [/g9]

Как я объяснил, для хранения текста первой строки используются одиночные байты. Двойные байты используются для хранения текста второй строки.

Вы можете быть удивлены, что эти символы выглядят ОК снаружи (при просмотре текста в Adobe Reader), но не соответствуют тому, что вы видите внутри (при просмотре второго снимка экрана), но вот как это работает.

ЗАКЛЮЧЕНИЕ:

Многие думают, что создание PDF тривиально, и что инструменты для создание PDF должно быть товаром. На самом деле это не всегда так просто: -)

30
задан 3 revs, 2 users 89% 4 July 2013 в 08:24
поделиться

6 ответов

Scala поставляется с довольно полными примерами приложений для основных элементов графического интерфейса, которые вы можете запустить, набрав scala scala.swing.test.UIDemo в командной строке. Вы можете просмотреть их исходный код здесь .

Вы также можете посмотреть этот документ , чтобы получить представление о принципах проектирования, лежащих в основе оболочки Scala Swing.

18
ответ дан 27 November 2019 в 23:42
поделиться

В настоящее время я разрабатываю приложение SWT на Scala, и оно мне очень нравится. Но я действительно ожидаю, что Clojure будет еще более компактным.

4
ответ дан 27 November 2019 в 23:42
поделиться

DISCLAIMER: Я программист на Clojure. Я явно предвзят.

Из всех этих языков, я думаю, Clojure и Groovy, вероятно, самые компактные. Scala - это язык с фигурными скобками, как Java, поэтому он занимает немного больше места. Однако он не такой многословный, как Java, и я думаю, что Scala довольно удивительна. Я знаю, что в Scala есть обертка для swing. Я никогда не занимался разработкой графических интерфейсов на Scala, поэтому не могу сказать, как это ощущается.

Я немного занимался разработкой свинга в Clojure, и это не занимает много времени. Использование swing непосредственно из Clojure может быть утомительным, пока вы не напишете себе некоторые абстракции, но в целом, приложения на swing меньше, чем то же самое на Java, потому что код на Clojure имеет тенденцию быть короче и лаконичнее, чем код на Java.

В Clojure также есть некоторые обертки, чтобы сделать разработку swing более Clojury. Одним из них является clj-swing. Я видел код, написанный с его помощью, и это довольно круто, и определенно более лаконично, чем прямой interop.

Теперь, я не знаю Groovy. Я действительно ничего о нем не знаю, но я знаю, что он компактнее Java, поэтому я представляю, что разработка графического интерфейса также будет достаточно компактной.

Я думаю, что Clojure - это безопасный вариант. С помощью clj-swing или даже прямого использования инструментария Java GUI будет действительно компактнее, чем на Java, а возможность создавать абстракции над некомпактными вещами с помощью макросов - это, безусловно, огромный плюс. Я отдаю свой голос за Clojure.

20
ответ дан 27 November 2019 в 23:42
поделиться

В Groovy есть средство, называемое Swing Builder , для упрощения программирования GUI. Вот фрагмент кода с отличного веб-сайта, он создает рамку с кнопкой и подсчитывает количество нажатий на нее:

int count = 0
new SwingBuilder().edt {
  frame(title:'Frame', size:[300,300], show: true) {
    borderLayout()
    textlabel = label(text:"Click the button!", constraints: BL.NORTH)
    button(text:'Click Me',
         actionPerformed: {count++; textlabel.text = "Clicked ${count} time(s)."; println "clicked"},
         constraints:BL.SOUTH)
  }
}
7
ответ дан 27 November 2019 в 23:42
поделиться

Я писал графический интерфейс, используя Clojure напрямую с Swing. До сих пор он действительно работал очень хорошо. Я также написал несколько пользовательских компонентов пользовательского интерфейса на Java, которые оказалось очень легко интегрировать с частью кода Clojure.

Я также считаю, что clj-swing выглядит великолепно - возможно, проще, чем использовать Swing напрямую, если у вас нет предыдущего опыта работы с Swing.

3
ответ дан 27 November 2019 в 23:42
поделиться

Groovy имеет структуру Griffon , которая использует соглашения, а не конфигурацию для создания приложений с графическим интерфейсом пользователя на JVM. Он похож на grails / rails, но с богатым графическим интерфейсом, а не с веб-приложением.

9
ответ дан 27 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: