т.к. пакет FX выпилили в отдельный модуль, то и для сборки/запуска нужно еще что то использовать, находится все в OpenJFX, по аналогии с JDK скачивается/ставится
Вроде как можно с помощью мавена включить зависимости в состав пакета, но что то не получается пока, включает все, но не запускается
Второй вариант, это таскать с собой эту jdk, указывая путь к ней при запуске, так работает
java --module-path path/to/javafx/lib --add-modules javafx.controls,javafx.fxml -jar myproject.jar
git
pow.xml
(...) <dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>20.0.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>com.sakeep.Launcher</mainClass> </configuration> </plugin> </plugins> </build> (...)
maven clean compile package install
На выходе файл 3кб, ест-но ничего не содержит в себе. и нихрена не запускается, даже на той же машине
возможно его надо мавеном запускать, но с ide-ешным хз как его там
(...) <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <archive> <manifest> <mainClass>com.sakeep.Launcher</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> (...)
На выходе уже файл 8мб, содержит в себе все классы, запускается на рабочей машине, но не стартует на другой, ошибки «unamed module..»
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 есть библиотека itext дока
Работать удобно, можно ШК организовать, но нет печати, для этого нашелся пакет 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();
import javafx.scene.control.Alert; ... Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Information"); alert.setHeaderText(null); alert.setContentText("Hello World!"); alert.showAndWait();