2012-04-23 7 views
6

मैं स्विंग जेटीबल में पूरी तरह से कोशिकाओं के चारों ओर सीमा को कैसे हटा सकता हूं, इसलिए कोशिकाओं के बीच कोई अंतराल नहीं है? यहाँ मैं क्या करने की कोशिश की है:पूरी तरह से jtable ग्रिड (सेल सीमा) को हटा रहा है

table.setShowGrid(false); 
table.setShowVerticalLines(false); 
table.setShowHorizontalLines(false); 

और एक सेल रेंडरर लेखन और का उपयोग कर: प्रत्येक व्यक्ति सेल के लिए

setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); 

लेकिन परिणाम यह है कि कोशिकाओं के बीच की रेखाएं हटा दी गई हैं लेकिन उनके बीच 1 पिक्सेल अंतर छोड़ा गया है।

उत्तर

12

इन उदाहरणों पर एक नज़र, है और एक सेल रेंडरर लेखन और का उपयोग कर:

सब कुछ निर्भर करता है प्रतिपादक क्या देता है, लेकिन प्रतिपादक के बिना के लिए काम करता है मुझे

  • setIntercellSpacing()

  • setShowGrid()

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class TableExample { 

    public TableExample() { 
     Object[][] data1 = new Object[50][5]; 
     for (int i = 0; i < data1.length; i++) { 
      data1[i][0] = "Company # " + (i + 1); 
      for (int j = 1; j < data1[i].length; j++) { 
       data1[i][j] = "" + (i + 1) + ", " + j; 
      } 
     } 
     String[] headers = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5"}; 
     DefaultTableModel model1 = new DefaultTableModel(data1, headers); 
     final JTable jTable3 = new TableBackroundPaint0(data1, headers); 
     //final JTable jTable3 = new JTable(data1, headers); 
     jTable3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     jTable3.setModel(model1); 
     final JScrollPane sp3 = new JScrollPane(); 
     sp3.setViewportView(jTable3); 
     jTable3.setIntercellSpacing(new Dimension(0, 0)); 
     jTable3.setShowGrid(false); 
     //jTable3.setPreferredScrollableViewportSize(jTable3.getPreferredSize()); 
     JFrame frame = new JFrame("tableSelection"); 
     frame.add(sp3); 
     frame.setSize(new Dimension(600, 200)); 
     //frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TableExample te = new TableExample(); 
      } 
     }); 
    } 
} 

class TableBackroundPaint0 extends JTable { 

    private static final long serialVersionUID = 1L; 

    TableBackroundPaint0(Object[][] data, Object[] head) { 
     super(data, head); 
     setOpaque(false); 
     ((JComponent) getDefaultRenderer(Object.class)).setOpaque(false); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     Color background = new Color(168, 210, 241); 
     Color controlColor = new Color(230, 240, 230); 
     int width = getWidth(); 
     int height = getHeight(); 
     Graphics2D g2 = (Graphics2D) g; 
     Paint oldPaint = g2.getPaint(); 
     g2.setPaint(new GradientPaint(0, 0, background, width, 0, controlColor)); 
     g2.fillRect(0, 0, width, height); 
     g2.setPaint(oldPaint); 
     for (int row : getSelectedRows()) { 
      Rectangle start = getCellRect(row, 0, true); 
      Rectangle end = getCellRect(row, getColumnCount() - 1, true); 
      g2.setPaint(new GradientPaint(start.x, 0, controlColor, (int) ((end.x + end.width - start.x) * 1.25), 0, Color.orange)); 
      g2.fillRect(start.x, start.y, end.x + end.width - start.x, start.height); 
     } 
     super.paintComponent(g); 
    } 
} 
+2

ध्यान दें,, 'setIntercellSpacing()' विधि _after_ आप एक स्तंभ मॉडल सेट (यदि आप ऐसा करने के लिए चुनते हैं) कॉल करने के लिए है कि आप क्योंकि यह मूल रूप से 'setColumnMargin()' '_current_ पर कॉल TableColumnModel' और 'JTable' पर 'setRowMargin()'। – hendrik

1

आप क्रम में JTable में इन विधियों का उपयोग कर सकते ग्रिड दूर करने के लिए यदि आपके स्तंभ मॉडल ऑटो पैदा नहीं कर रहे हैं (डेटा बाध्यकारी के बिना)।

setShowGrid(false); 
setRowMargin(0); 
setShowVerticalLines(false); 
setShowHorizontalLines(false); 

लेकिन यदि आपने डेटा बाइंडिंग का उपयोग करके कॉलम मॉडल बनाए हैं तो आपको परेशानी होगी। यह तब भी है जब आप इन तरीकों को बुलाते हैं, फिर भी वे प्रत्येक कॉलम मार्जिन में सफेद 1 पिक्सेल अंतर को पेंट करते हैं।

आप कस्टम डिफ़ॉल्टTableColumnModel का उपयोग कर उस कॉलम मार्जिन को हटा सकते हैं।

private class CustomDefaultTableColumnModel extends DefaultTableColumnModel{ 

@Override 
public void setColumnMargin(int newMargin) { 
    //Always set ColumnMargin to zero. 
    //Because after the column data binding its internally set one as ColumnMargin. 
    //That course to paint white color grid. 
    //To stop we override the setColumnMargin and pass zero to ColumnMargin. 
    super.setColumnMargin(0); 
    } 
} 

फिर आप अपनी तालिका में अपना कस्टम टेबल कॉलम मॉडल जोड़ सकते हैं।

setColumnModel(new CustomDefaultTableColumnModel()); 
+0

चयनित पंक्ति में उस गंदा सफेद रंग 1 पिक्सेल ग्रिड होने से बचने के लिए यह सबसे अच्छा समाधान है। हो सकता है कि मैं getColumnMargin विधि को ओवरराइड करने के बजाय getColumnMargin को हमेशा 0 वापस करने के लिए ओवरराइड करने की अनुशंसा करता हूं, लेकिन यह बहुत करीब है। – Ansharja

संबंधित मुद्दे