2014-10-27 41 views
0

我嘗試使用主JTable的選定行和相同的頭和單元格渲染執行臨時JTable,但是當我嘗試打印它時,我只是得到一個帶有行邊框的空矩形,I在How to print out specific rows/columns of a JTable?看到使用矩形和小區邊界的另一種方式,但我不明白,我需要一些幫助,以使其更清晰如何打印選定的行JTable

+0

我假設你的意思是,你創建了第二個JTable,帶有一個Tab leModel'其中包含來自主JTable'的所選行... – MadProgrammer 2014-10-27 03:55:57

+0

是的,它不起作用 – 2014-10-27 04:01:32

回答

3

似乎工作沒關係,我...

Print Table

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.print.PrinterException; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 

public class TestPrint { 

    public static void main(String[] args) { 
     new TestPrint(); 
    } 

    public TestPrint() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       DefaultTableModel model = new DefaultTableModel(0, 26); 
       for (int row = 0; row < 26; row++) { 
        Vector data = new Vector(26); 
        for (int col = 0; col < 26; col++) { 

         String value = row + "x" + ((char) (col + 'A')); 
         data.add(value); 

        } 
        model.addRow(data); 
       } 

       JTable table = new JTable(model); 

       JButton print = new JButton("Print"); 
       print.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         try { 
          DefaultTableModel viewModel = (DefaultTableModel) table.getModel(); 
          DefaultTableModel printModel = new DefaultTableModel(0, viewModel.getColumnCount()); 
          for (int row : table.getSelectedRows()) { 
           printModel.addRow((Vector) viewModel.getDataVector().get(row)); 
          } 
          JTable toPrint = new JTable(printModel); 
          toPrint.setSize(toPrint.getPreferredSize()); 
          JTableHeader tableHeader = toPrint.getTableHeader(); 
          tableHeader.setSize(tableHeader.getPreferredSize()); 
          toPrint.print(JTable.PrintMode.FIT_WIDTH); 
         } catch (PrinterException ex) { 
          ex.printStackTrace(); 
         } 
        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.add(print, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

你的例子完美的工作,我會檢查我的問題是什麼,非常感謝。 – 2014-10-27 04:31:16

+0

我「懷疑」桌子在打印前需要調整大小,但這只是我頭頂的想法 – MadProgrammer 2014-10-27 04:33:40

+0

是的,這是關於大小,但現在我有另一個問題,toPrint JTable的打印版本是不同的主表可打印,所有列的寬度是方式更小,我試圖設置setPreferredWidth與每列的寬度,但它仍然給我小列 – 2014-10-27 05:05:16