2012-10-16 22 views
1

我正在使用JTable 1點邊框不出現在網格線上

iText版本5.3.3。 JAVA JDK 1.6.0

我的工作在哪裏用戶希望的定製JTable的細胞與下面的JTable中出現1點黑色邊框報表軟件: -

JTable output

PDF輸出:

Pdf output

在這兩個輸出端有在細胞1點邊界小區之間的一些間隙。我們發現線條不在網格線上。 有沒有可能這些邊界線作爲1點線出現在網格上。 以下是使用JTable和pdf測試上述問題的示例代碼。

TableImage.java

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.border.LineBorder; 
import javax.swing.table.JTableHeader; 
import com.lowagie.text.Document; 
import com.lowagie.text.PageSize; 
import com.lowagie.text.pdf.PdfContentByte; 
import com.lowagie.text.pdf.PdfTemplate; 
import com.lowagie.text.pdf.PdfWriter; 

class TableImage { 

    public static void main(String[] args) throws Exception { 
     Object[][] data = { 
      {"Hari", new Integer(23), new Double(78.23), (true)}, 
      {"James", new Integer(23), new Double(47.64), (false)}, 
      {"Sally", new Integer(22), new Double(84.81), (true)} 
     }; 
     String[] columns = {"Name", "Age", "GPA", "Pass"}; 
     JTable table = new JTable(data, columns); 
     JScrollPane scroll = new JScrollPane(table); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(scroll, BorderLayout.CENTER); 
     JOptionPane.showMessageDialog(null, p); 
     JTableHeader h = table.getTableHeader(); 
     int x = table.getWidth(); 
     int y = table.getHeight(); 
     table.setDefaultRenderer(Object.class, 
       new ColumnAlignmentRenderer(
       table.getDefaultRenderer(Object.class))); 
     BufferedImage bi = new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB); 
     Graphics g = bi.createGraphics(); 
     Graphics2D g2 = (Graphics2D) g; 
     table.paint(g2); 
     JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi))); 
     print(table); 
    } 

    private static void print(JTable table) { 
     Document document = new Document(PageSize.A4.rotate()); 
     try { 
      PdfWriter writer = PdfWriter.getInstance(document, 
        new FileOutputStream("F://jTable.pdf")); 
      document.open(); 
      PdfContentByte cb = writer.getDirectContent(); 
      cb.saveState(); 
      PdfTemplate pdfTemplate = cb.createTemplate(
        table.getWidth(), table.getHeight()); 
      Graphics2D g2 = pdfTemplate.createGraphics(
        table.getWidth(), table.getHeight()); 
      table.print(g2); 
      cb.addTemplate(pdfTemplate, 20, 100); 
      g2.dispose(); 
      cb.restoreState(); 
     } catch (Exception e) { 
      System.err.println(e.getMessage()); 
     } 
     document.close(); 
    } 

    private TableImage() { 
    } 
} 

ColumnAlignmentRenderer.java

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Font; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.BorderFactory; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.SwingConstants; 
import javax.swing.border.Border; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableCellRenderer; 

public class ColumnAlignmentRenderer extends DefaultTableCellRenderer { 

    private TableCellRenderer mWrappedRenderer; 
    private HashMap objFormatCellMap; 

    public ColumnAlignmentRenderer(TableCellRenderer pWrappedRenderer) { 
     mWrappedRenderer = pWrappedRenderer; 
    } 

    public Component getTableCellRendererComponent(JTable pTable, 
      Object pValue, boolean pIsSelected, 
      boolean pHasFocus, int pRow, int pColumn) { 
     int hAlignment = SwingConstants.LEFT; 
     int vAlignment = SwingConstants.CENTER; 
     String pattern = "##000.0"; 
     Font font = pTable.getFont(); 
     Border cellBorder = pTable.getBorder(); 
     // Border cellBorder = BorderFactory.createCompoundBorder(); 
     Color backgroundColor = Color.WHITE; 
     Color foregroundColor = Color.BLACK; 
     // Use the wrapped renderer 
     Component renderedComponent = 
       mWrappedRenderer.getTableCellRendererComponent(
       pTable, pValue, pIsSelected, pHasFocus, pRow, pColumn); 
     int iLeft = 1; 
     int iRight = 1; 
     int iTop = 1; 
     int iBottom = 1; 
     Map fontAttributes = font.getAttributes(); 
     cellBorder = BorderFactory.createCompoundBorder(cellBorder, 
       new ZoneBorder(iTop, iLeft, iBottom, iRight, Color.BLACK)); 
     ((JLabel) renderedComponent).setBorder(cellBorder); 
     if (pIsSelected) { 
      renderedComponent.setBackground(pTable.getSelectionBackground()); 
     } 
     return renderedComponent; 
    } 

    public void setHashFormatCellData(HashMap hashFormatCellData) { 
     this.objFormatCellMap = hashFormatCellData; 
    } 
} 

ZoneBorder.java

import java.awt.*; 
import javax.swing.border.*; 

public class ZoneBorder implements Border { 

    private static final int WIDTH = 1; 
    private Color color; 
    private int iTop = 0, iRight = 0, iBottom = 0, iLeft = 0; 

    public ZoneBorder(int T, int R, int B, int L, Color color) { 
     this.iTop = T; 
     this.iRight = R; 
     this.iBottom = B; 
     this.iLeft = L; 
     this.color = color; 
    } 

    public boolean isBorderOpaque() { 
     return false; 
    } 

    public Insets getBorderInsets(Component c) { 
     return new Insets(iTop, iRight, iBottom, iLeft); 
    } 

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     Color oldColor = g.getColor(); 
     g.setColor(color); 
     for (int i = 0; i < iTop; i++) { 
      g.drawLine(x, y + i, x + width - 1, y + i); 
     } 
     //g.setColor(southColor); 
     for (int i = 0; i < iBottom; i++) { 
      g.drawLine(x, y + height - i - 1, x + width - 1, y + height - i - 1); 
     } 
     //g.setColor(eastColor); 
     for (int i = 0; i < iLeft; i++) { 
      g.drawLine(x + i, y, x + i, y + height - 1); 
     } 
     //g.setColor(westColor); 
     for (int i = 0; i < iRight; i++) { 
      g.drawLine(x + width - i - 1, y, x + width - i - 1, y + height - 1); 
     } 
     g.setColor(oldColor); 
    } 
} 
  • 更新1

我改變了代碼以減小一個表格單元格爲0的intercellspacing與

table.setIntercellSpacing(new Dimension(0,0)); 

以及也改變了行餘量爲0

table.setRowMargin(0); 

但是,當行是更它示出了我在一些地方的行之間空行如下: -

row spacing image

爲此,我增加了數據到9行與下面的代碼: -

Object[][] data = { 
     {"Hari", new Integer(23), new Double(78.23), (true)}, 
     {"James", new Integer(23), new Double(47.64), (false)}, 
     {"Sally", new Integer(22), new Double(84.81), (true)}, 
     {"Sally", new Integer(22), new Double(84.81), (true)}, 
     {"Sally", new Integer(22), new Double(84.81), (true)}, 
     {"Hari", new Integer(23), new Double(78.23), (true)}, 
     {"James", new Integer(23), new Double(47.64), (false)}, 
     {"Hari", new Integer(23), new Double(78.23), (true)}, 
     {"James", new Integer(23), new Double(47.64), (false)} 
    }; 

請提出這個東西。

**

  • 更新2

**

我認爲,如果我們看到了PDF在75%zoomin的JTable看起來準確。但是,當這個JTable被看到在100%它顯示與細胞外的邊界和顏色的差異。 我們是否有什麼可以通過它將可打印的表格打印(即table.print(g))從75%增加到25%,然後將其打印到PDF,即100%。如果有任何JTable擴展的想法,這將是很大的幫助! 謝謝!

+1

1)爲了更好地幫助越早,張貼[SSCCE] (http://sscce.org/)。 2)請爲代碼塊使用一致的邏輯縮進。 3)不需要在所有其他源代碼行上放一個空行! 4)我想知道爲什麼這種「不能把表格放入PDF」式的問題突然出現? –

+3

..&Hari,James&Sally?我[很瞭解他們](http://stackoverflow.com/q/7369814/418556)! ;) –

回答

2

我推薦使用

table.setGridColor(Color.black); 

否則,如果你想使用自定義呈現

table.setIntercellSpacing(new Dimension(0,0)); 

(並確保您的渲染器設置正確的邊界)。

編輯

個人而言,你的更新聞起來像一個新的問題(這將是非常高興看到您的新更新的代碼 - 但它可能會損害到原來的問題/答案)。

我懷疑你的問題可能在這個地方躺下(這似乎有點腥):

Border cellBorder = pTable.getBorder(); 
... 
cellBorder = BorderFactory.createCompoundBorder(cellBorder, 
      new ZoneBorder(iTop, iLeft, iBottom, iRight, Color.BLACK)); 
((JLabel) renderedComponent).setBorder(cellBorder); 

你能解釋一下爲什麼你抓住桌子的邊緣,與另一邊界混合,然後加入導致每個細胞?

邊欄:如果你想要更多的幫助到他們的答案註釋標記的人,使他們更有可能幫助比unaccepting他們的答案......