最近我一直在研究一个使用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
中的getOppositeWindow()
和WindowEvent
方法来获取对打印对话框的引用。我仍然使用反射(获取实例类的名称)来检查“对面窗口”是否是打印对话框,或者只是我应用程序中的普通对话框。无论如何,欢迎提供更优雅的解决方案。
答案 0 :(得分:2)
这是因为这个
frame.setAlwaysOnTop(true);
然后将其更改为false
以查看打印窗口。
或
如果您不希望主窗口阻止其他窗口,请删除该行。无论如何,默认值为false。