我的疑问是......
JFrame ActualFrame = new JFrame("Actual frame");
JScrollPane pane = new JScrollPane(new JTable(data, columns));
ActualFrame.add(pane);
ActualFrame.add(PrintPreviewBtn);
PrintPreviewBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFrame PreviewFrame = new JFrame("Preview");
PreviewFrame.add(pane, BorderLayout.CENTER);
}
当我运行程序时,一切似乎都很好但是当我按下打印预览按钮时,预览框显示出来,当我最大化或调整ActualFrame时,表格会消失....
注意: 我将窗格添加到预览框中以显示它好像是显示的表的预览.....是打印预览的任何其他方法
答案 0 :(得分:1)
对于打印,有java.awt.PrinterJob类。要显示标准打印预览,您应该致电:
PrinterJob job = PrinterJob.getPrinterJob();
job.printDialog();
答案 1 :(得分:1)
组件只能属于单个父组件。当您将其添加到PreviewFrame
时,它会自动从ActualFrame
删除。
使用上一个模型创建新的JTable
,而不是使用上一个面板。
<强>更新强>
打印表格稍微复杂一些,包括标题,并且需要调整列的大小以满足可用空间的要求。
查看Printing Tables tutorial的一些示例
答案 2 :(得分:0)
JScrollPane从ActualFrame
消失的原因是:您在pane
中添加了PreviewFrame
的相同实例。因此pane
的实际容器现在是PreviewFrame
而不是ActualFrame
。最大化或调整ActualFrame
的大小时,它会重新绘制其子组件。由于pane
现在不再属于ActualFrame
,因此现在不会显示pane
。
避免这种情况的最佳方法是首先创建一个单独的JTabel
实例,而不是在创建对象JTable
时在JScrollPane
的构造函数中传递匿名pane
类对象。获取该TableModel
实例的TableColumnModel
和JTable
。在previewFrame
中添加JScrollPane
的新实例,该实例将包含具有相同JTable
和TableModel
个对象的新TableColumnModel
实例。
守则看起来像这样:
final JTable table = new JTable(data,columns);
JScrollPane pane = new JScrollPane(table);
ActualFrame.add(pane);
ActualFrame.add(PrintPreviewBtn);
PrintPreviewBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFrame previewFrame = new JFrame("Preview");
javax.swing.table.TableModel tabModel = table.getModel();
javax.swing.table.TableColumnModel colModel = table.getColumnModel();
JScrollPane previewPane = new JScrollPane(new JTable(tabModel,colModel));
previewFrame.getContentPane().add(previewPane, BorderLayout.CENTER);
previewFrame.pack();previewFrame.setVisible(true);
}