2012-04-23 21 views
6

¿Cómo puedo eliminar completamente el borde alrededor de las celdas JTable, para que las celdas no tengan espacios entre ellas? Esto es lo que he intentado:eliminando la rejilla jtable (borde de la celda) completamente

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

y escribir un procesador de celdas y usar:

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

para cada célula individual.

Pero el resultado es que las líneas entre las celdas se eliminan pero queda un espacio de 1 píxel entre ellas.

Respuesta

12

y escribir un procesador de celdas y usar:

todo depende de lo Procesador regresa pero sin Renderizador trabaja para me

  • 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

Tenga en cuenta, que usted tiene que llamar a la 'setIntercellSpacing()' método _after_ establece un modelo de columna (si decide hacerlo), porque básicamente llama 'setColumnMargin()' 'en el _current_ TableColumnModel' y 'setRowMargin()' en el 'JTable' en sí. – hendrik

1

Puede utilizar estos métodos en JTable con el fin de eliminar la red si sus modelos de columnas no son de generación automática (sin enlace de datos).

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

Pero si ha creado modelos de columnas utilizando el enlace de datos, entonces tiene problemas. Es decir, incluso si llama a estos métodos, su blanco sigue siendo blanco de 1 píxel de pintura en cada margen de columna.

Puede eliminar ese margen de columna utilizando DefaultTableColumnModel personalizado.

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); 
    } 
} 

Luego puede agregar el modelo de columna de la mesa personalizado a su mesa.

setColumnModel(new CustomDefaultTableColumnModel()); 
+0

Esta es la mejor solución para evitar tener esa desagradable red de 1 píxel de color blanco en la fila seleccionada. Tal vez recomendaría anular getColumnMargin para que devuelva 0 siempre, en lugar de anular el método setColumnMargin, pero está muy cerca. – Ansharja

Cuestiones relacionadas