====== JavaFX_howto ======
===== Сборка/запуск =====
:!: Доп пакеты
т.к. пакет FX выпилили в отдельный модуль, то и для сборки/запуска нужно еще что то использовать, находится все в [[https://openjfx.io/|OpenJFX]], по аналогии с JDK скачивается/ставится\\
Вроде как можно с помощью мавена включить зависимости в состав пакета, но что то не получается пока, включает все, но не запускается\\
Второй вариант, это таскать с собой эту jdk, указывая путь к ней при запуске, так работает
java --module-path path/to/javafx/lib --add-modules javafx.controls,javafx.fxml -jar myproject.jar
:!: Проба1_javafx-maven-plugin
[[https://github.com/openjfx/javafx-maven-plugin|git]]\\
pow.xml
(...)
org.openjfx
javafx-controls
20.0.1
org.openjfx
javafx-maven-plugin
0.0.8
com.sakeep.Launcher
(...)
maven clean compile package install
На выходе файл 3кб, ест-но ничего не содержит в себе. и нихрена не запускается, даже на той же машине\\
возможно его надо мавеном запускать, но с ide-ешным хз как его там\\
:!: Добавим плагин maven-assembly-plugin
(...)
org.apache.maven.plugins
maven-assembly-plugin
package
single
com.sakeep.Launcher
jar-with-dependencies
(...)
На выходе уже файл 8мб, содержит в себе все классы, запускается на рабочей машине, но не стартует на другой, ошибки "unamed module.."\\
:!:
===== Image =====
:!: Image to BufferedImage, save to File
Image img = (откуда нибудь берем Image);
BufferedImage bImage = new BufferedImage(img.getWidth(null)+20, img.getHeight(null)+20, BufferedImage.TYPE_INT_ARGB);
Graphics2D bGr = bImage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();
File outputfile = new File("itext_img.png");
ImageIO.write(bImage, "png", outputfile);
===== PDF =====
Для работы с pdf есть библиотека itext [[https://api.itextpdf.com/iText5/java/5.5.9/com/itextpdf/text/Image.html#setAlignment-int-|дока]]\\
Работать удобно, можно ШК организовать, но нет печати, для этого нашелся пакет [[https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox|Apache PDFBox]]
:!: Примеры
Генерация ШК и сохранение
com.itextpdf.text.Document document = new com.itextpdf.text.Document();
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("tmp/itext_probe.pdf"));
document.setPageSize(new com.itextpdf.text.Rectangle(58,40));
document.setMargins(2,2,2,2);
document.open();
PdfContentByte pdfContentByte = pdfWriter.getDirectContent();
// Генерируем баркод
Barcode128 barcode128 = new Barcode128();
barcode128.setCode("myString");
barcode128.setCodeType(Barcode128.CODE128);
// Размеры
barcode128.setSize(10);
barcode128.setBarHeight(70);
com.itextpdf.text.Image code128Image = barcode128.createImageWithBarcode(pdfContentByte, null, null);
code128Image.scaleToFit(55,40);
code128Image.setAbsolutePosition(10,10);
document.add(code128Image);
document.close();
Печать
PDDocument pdfDoc = PDDocument.load(new File("tmp/itext_probe.pdf"));
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(pdfDoc));
job.setPrintService(printServices[0]);
job.print();
===== Печать =====
:!: Пример печати изображения с текстом
java.awt.Image awtImage = barcode128.createAwtImage(Color.black, Color.WHITE);
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
PrinterJob job = PrinterJob.getPrinterJob();
// Размеры страницы для печати
PageFormat pageForm = job.defaultPage();
Paper paper = pageForm.getPaper();
double width = 8d * 72d;
double height = 4d * 72d;
double margin = 1d * 72d;
paper.setSize(width, height);
//paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2));
paper.setImageableArea(0, 0, width, height);
//pageForm.setOrientation(PageFormat.LANDSCAPE);
pageForm.setPaper(paper);
job.setPrintable(new Printable() {
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex != 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) graphics;
g2d.drawImage(awtImage, 40, 5, null);
// Пишем текст
g2d.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 9));
FontMetrics fm = g2d.getFontMetrics();
String text = selectedProd.getName();
// центрирование текста под ШК
int centerBarcode = awtImage.getWidth(null) / 2 + 40;
int centerText = fm.stringWidth(text) / 2;
// добавляем начальный отступ, как у изображения (15)
// добвялем высоту самого изображения и высоту текста
int yForText= 5 + awtImage.getHeight(null) + fm.getAscent();
g2d.drawString(text, centerBarcode - centerText, yForText);
// объем на второй строке
text = selectedProd.getSelectedVolume().getName();
// центрирование текста под ШК
centerText = fm.stringWidth(text) / 2;
// добавляем начальный отступ, как у изображения (15)
// добвялем высоту самого изображения и высоту текста
yForText= 5 + awtImage.getHeight(null) + (fm.getAscent() * 2);
g2d.drawString(text, centerBarcode - centerText, yForText);
return PAGE_EXISTS;
}
}, pageForm);
job.setPrintService(printServices[0]);
//if (job.printDialog())
job.print();
===== Сообщения =====
:!: Alert
import javafx.scene.control.Alert;
...
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Information");
alert.setHeaderText(null);
alert.setContentText("Hello World!");
alert.showAndWait();