当帧最大化时,Scrollpane会消失

时间:2013-01-15 17:57:43

标签: java swing jscrollpane jbutton actionlistener

我的疑问是......

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

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

3 个答案:

答案 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实例的TableColumnModelJTable。在previewFrame中添加JScrollPane的新实例,该实例将包含具有相同JTableTableModel个对象的新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);
}