0

我的问题是这个......

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 的大小时,表格会消失......

注意:我将窗格添加到预览框架中,以显示它好像是所显示表格的预览......是打印预览的任何其他方法

4

3 回答 3

1

对于打印,有 java.awt.PrinterJob 类。要显示标准打印预览,您应该调用:

PrinterJob job = PrinterJob.getPrinterJob();
job.printDialog();
于 2013-01-15T18:43:29.817 回答
1

一个组件只能属于一个父级。当您将其添加到 时PreviewFrame,它会自动从 中删除ActualFrame

不要使用前一个面板,而是使用前一个面板中的模型创建一个新JTable的 。

更新

打印表格稍微复杂一些,包括标题,并且需要调整列的大小以满足可用空间的要求。

查看打印表教程以获取一些示例

于 2013-01-15T20:08:57.793 回答
0

JScrollPane 从 中消失的原因ActualFrame是:您正在添加panein的相同实例PreviewFrame。所以实际的容器pane现在是PreviewFrame而不是ActualFrame. 当您最大化或调整大小时ActualFrame,它会重新绘制其子组件。由于pane现在不再属于它,ActualFrame所以它不显示pane现在。

避免这种情况的最好方法是先创建一个单独的实例,而不是在创建对象时在构造函数JTabel中传递匿名JTable类对象。获取该实例的and 。添加一个新实例将包含具有相同和对象的新实例。代码看起来像这样:JScrollPanepaneTableModelTableColumnModelJTablepreviewFrameJScrollPaneJTableTableModelTableColumnModel

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);
}
于 2013-01-15T20:49:32.480 回答