我写了一个打印JFrame内容的Java程序.它在框架中的标签中与英语完美配合,但当我在其中使用Malayalam unicode字符串时出错.
import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.swing.JLabel; public class MalayalamPrintingSSCCE { private static Frame frame; public static void main(String[] args) { frame = new Frame(); frame.setLayout(new FlowLayout()); frame.add(new JLabel("Vishnu1")); frame.add(new JLabel("\u0D35\u0D3F\u0D37\u0D4D\u0D23\u0D41"));//?????? frame.add(new JLabel("\u0D35\u0D3F\u0D37\u0D4D\u0D23\u0D41"));//?????? frame.add(new JLabel("\u0D35\u0D3F\u0D37\u0D4D\u0D23\u0D41"));//?????? frame.add(new JLabel("Vishnu4")); frame.setVisible(true); frame.pack(); PrinterJob pj = PrinterJob.getPrinterJob(); pj.setJobName(" Print Component "); pj.setPrintable(new Printable() { public int print(Graphics pg, PageFormat pf, int pageNum) { if (pageNum > 0) { return Printable.NO_SUCH_PAGE; } Dimension dim = frame.getSize(); double cHeight = dim.getHeight(); double cWidth = dim.getWidth(); // get the bounds of the printable area double pHeight = pf.getImageableHeight(); double pWidth = pf.getImageableWidth(); double pXStart = pf.getImageableX(); double pYStart = pf.getImageableY(); double xRatio = pWidth / cWidth; double yRatio = pHeight / cHeight; Graphics2D g2 = (Graphics2D) pg; g2.translate(pXStart, pYStart); g2.scale(xRatio, xRatio); frame.paint(g2); return Printable.PAGE_EXISTS; } }); try { if (pj.printDialog()) { pj.print(); } } catch (PrinterException ex) { // handle exception } } }
打印机输出英文: 使用马拉雅拉姆语输出打印机 但是,框架渲染正确如下: 我怎样才能解决这个问题?有没有更好的方法呢?
您可以添加font
到label
并可以打印马拉雅拉姆语Frame
以下显示了一个在malayalam中打印我的名字的简单代码:
import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; /** * @author Rakesh KR */ public class SimpleGUI1 { public static void main(String[] args) { SimpleGUI1 gUI = new SimpleGUI1(); gUI.action(); } void action(){ JFrame frame = new JFrame(); JLabel label = new JLabel("??????"); // Can also use unicode //JLabel label= new JLabel("\u0d30\u0d3e\u0d15\u0d47\u0d37\u0d4d"); Font font = new Font("Arial Unicode MS", Font.PLAIN, 12); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setFont(font); frame.add(label); frame.setSize(100,100); frame.setVisible(true); } }
产量
编辑
通过使用上面frame
(添加的字体)我们也可以打印马拉雅拉姆语.
import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; /** * @author Rakesh KR */ public class SimpleGUI1 { public static void main(String[] args) { SimpleGUI1 gUI = new SimpleGUI1(); gUI.action(); } void action(){ JFrame frame = new JFrame(); JLabel label = new JLabel("??????"); // Can also use unicode //JLabel label= new JLabel("\u0d30\u0d3e\u0d15\u0d47\u0d37\u0d4d"); Font font = new Font("Arial Unicode MS", Font.PLAIN, 12); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setFont(font); frame.add(label); frame.setSize(100,100); frame.setVisible(true); PrinterJob pj = PrinterJob.getPrinterJob(); pj.setJobName(" Print Component "); pj.setPrintable(new Printable() { public int print(Graphics pg, PageFormat pf, int pageNum) { if (pageNum > 0) { return Printable.NO_SUCH_PAGE; } Dimension dim = frame.getSize(); double cHeight = dim.getHeight(); double cWidth = dim.getWidth(); // get the bounds of the printable area double pHeight = pf.getImageableHeight(); double pWidth = pf.getImageableWidth(); double pXStart = pf.getImageableX(); double pYStart = pf.getImageableY(); double xRatio = pWidth / cWidth; double yRatio = pHeight / cHeight; Graphics2D g2 = (Graphics2D) pg; g2.translate(pXStart, pYStart); g2.scale(xRatio, xRatio); frame.paint(g2); return Printable.PAGE_EXISTS; } }); try { if (pj.printDialog()) { pj.print(); } } catch (PrinterException ex) { } } } }
输出: Pdf保存打印页面的格式
单个标签上的编辑结果还可以.但两种语言的多个标贴,错误发生
对于您需要添加一个JPanel
在JFrame
和到JPanel
像添加所需的组件JLabel
.
final JFrame frame = new JFrame(); JPanel panel = new JPanel(); JLabel label = new JLabel("??????"); JLabel label1 = new JLabel("Rakesh"); JLabel label2 = new JLabel("\u0d30\u0d3e\u0d15\u0d47\u0d37\u0d4d"); JLabel label3 = new JLabel("Rakesh"); Font font = new Font("Arial Unicode MS", Font.PLAIN, 12); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setFont(font); label1.setFont(font); label2.setFont(font); label3.setFont(font); panel.add(label); panel.add(label1); panel.add(label2); panel.add(label3); frame.add(panel); frame.setSize(300,300); frame.setVisible(true); frame.pack();
输出: