我有以下程式將文本字串放入 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 中即可。我不想要任何文字換行。放在螢屏上后,它不會改變(它是一個報告)。
問題是在列印機上列印的文本太大。我不想減小視窗中文本的大小。我不想將文本放入檔案并列印檔案。該文本是我的 Java 程式中的一個長字串,無需將其創建為檔案。
當我嘗試搜索解決方案時,我收到了很多關于使用 System.out.println 從 eclipse 列印的文章,以及涉及使用 Graphics 物件呈現單個文本字串的偶爾文章。我希望有更簡單的東西;該程式確實進行了列印,我只需要不同的字體。
我嘗試將文本放入另一個 JTextArea 并為其提供具有不同大小的派生字體,但這不起作用——我沒有渲染該文本區域,也不知道這是否重要。這是完成這項作業的方法嗎?我已經看到對圖形螢屏外緩沖區的參考,但不知道如何告訴我的文本組件將自己呈現到螢屏外緩沖區。
還是有更好的方法來完成這項作業?
uj5u.com熱心網友回復:
使用您想要的字體創建一個新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);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429874.html
上一篇:無法將自定義ActiveX控制元件添加到.NETWinForms應用程式。.NETFrameworkWinForms應用程式運行良好
