【发布时间】:2015-05-20 13:38:15
【问题描述】:
最近我一直在研究一个使用 Java Swing 构建 GUI 的项目。我想在JTextArea 中打印文本,因此我写了类似
boolean printed = textArea.print();
这会打开一个模式对话框。然而,对话框似乎没有父级,并且主框架(包含textArea 的框架)阻止了打印对话框。
如您所见,打印对话框(底部的细线)位于主 JFrame 后面。
代码:
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
public class JTextAreaPrintBug {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,600);
frame.setLocationRelativeTo(null);
frame.setAlwaysOnTop(true);
//now add JTextArea
frame.setLayout(new BorderLayout());
JTextArea textArea = new JTextArea();
frame.add(textArea, BorderLayout.CENTER);
frame.setVisible(true);
try {
textArea.print();
} catch (PrinterException ex) {}
}
});
}
}
是否可以将打印对话框置于前面(或显式设置打印对话框的父级),最好不要重新发明轮子?提前致谢。
编辑:我知道有一行frame.setAlwaysOnTop(true);。我真正想要的是将打印对话框放在最前面,即使主框架始终位于顶部。
编辑 (2):我最终选择了一种解决方法,它使用 WindowFocusListener 和 WindowEvent 中的 getOppositeWindow() 方法来获取对打印对话框的引用。我仍然求助于反射(获取实例类的名称)来检查“对面窗口”是打印对话框,还是我的应用程序中的普通对话框。无论如何,欢迎提供更优雅的解决方案。
【问题讨论】:
-
你的框架需要一直在顶部吗?
-
不幸的是,是的。事实上,我已经想到了一种解决方法,它在调用
print()之前调用frame.setAlwaysOnTop(false),然后再恢复设置。但是,我只是想获得对打印对话框的更多控制(例如,我可能需要进一步设置位置),所以我正在寻找一个优雅的解决方案。
标签: java swing printing dialog jtextarea