从文本组件设置打印操作的字体大小

Setting font size for a print operation from a text component

我有以下程序将文本字符串放入 JTextArea 并提供用于打印它的打印对话框:

public class PrintTest
{
  private static String fontName = Font.MONOSPACED; // "Verdana"
  private static FontUIResource defaultFixedWidthCellFont = new FontUIResource(fontName, Font.PLAIN, 16);
  public static FontUIResource getDefaultCellFont() { return defaultFixedWidthCellFont; }

  public static void main(String[] args)
  {
    JFrame frame = new JFrame("Print test");
    JTextArea textArea = new JTextArea();
    
    textArea.setEditable(false);
    textArea.setFont(getDefaultCellFont());
    textArea.setPreferredSize(new Dimension(400,200));

    textArea.setText("one and two and three");
    JScrollPane scrollPane = new JScrollPane(textArea);
    frame.add(scrollPane);
    frame.pack();
    frame.setVisible(true);
    
    try { textArea.print(); }
    catch (PrinterException pe) { pe.printStackTrace(); }

  }

}

在实际应用中,文本区不需要编辑,需要是这个大小的定宽字体。我愿意使用 JTextArea 以外的文本组件,只要我能将它设置为固定宽度的字体大小并将其放在 JScrollPane 中即可。我不想要任何文字换行。搬上银幕后,没有变化(是报道)。

问题是在打印机上打印的文本太大。我不想缩小 window 中的文本大小。我不想将文本放入文件中并打印文件。文本在我的Java程序中是一个长字符串,不需要将其制作成文件。

当我尝试搜索解决方案时,我得到了很多关于使用 System.out.println 从 eclipse 进行打印的文章,偶尔还有一篇涉及使用 Graphics 对象呈现单个文本字符串的文章。我希望有更简单的东西;该程序确实可以打印,我只需要一种不同的字体。

我尝试将文本放入另一个 JTextArea 并为其提供不同大小的派生字体,但这没有用——我没有呈现该文本区域,不知道这是否重要.这是完成这项工作的方法吗?我已经看到对图形的屏幕外缓冲区的引用,但不知道如何告诉我的文本组件将自身呈现到屏幕外缓冲区。

或者有更好的方法来完成这项工作吗?

用你想要的字体创建一个新的 JTextArea 并打印它而不是屏幕上的字体

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.plaf.FontUIResource;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        private static String fontName = Font.MONOSPACED; // "Verdana"
        private static FontUIResource defaultFixedWidthCellFont = new FontUIResource(fontName, Font.PLAIN, 32);
        private static FontUIResource defaultFixedWidthPrintFont = new FontUIResource(fontName, Font.PLAIN, 8);

        public static FontUIResource getDefaultCellFont() {
            return defaultFixedWidthCellFont;
        }

        public static FontUIResource getDefaultPrintFont() {
            return defaultFixedWidthPrintFont;
        }

        public TestPane() {
            setLayout(new BorderLayout());
            JTextArea textArea = new JTextArea();

            textArea.setEditable(false);
            textArea.setFont(getDefaultCellFont());

            textArea.setText("one and two and three");
            JScrollPane scrollPane = new JScrollPane(textArea);
            add(scrollPane);

            JButton print = new JButton("Print");
            add(print, BorderLayout.SOUTH);

            print.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JTextArea printTA = new JTextArea(textArea.getText());
                    printTA.setFont(getDefaultPrintFont());
                    try {
                        printTA.print();
                    } catch (PrinterException pe) {
                        pe.printStackTrace();
                    }
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 200);
        }
    }
}