2012-04-23 18 views
6

Come posso rimuovere il bordo intorno alle celle in un altalena JTable completamente, in modo che le cellule non hanno spazi tra di loro? Ecco che cosa ho provato:rimozione griglia JTable (bordo della cella) completamente

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

e la scrittura di un renderer di celle e l'utilizzo di:

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

per ogni singola cella.

Ma il risultato è che le linee tra le celle vengono rimosse, ma tra di esse rimane uno spazio di 1 pixel.

risposta

12

e la scrittura di un renderer di celle e l'utilizzo di:

tutto dipende da quello che renderer torna ma senza renderer lavora per 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

nota, che si deve chiamare il 'setIntercellSpacing()' metodo _after_ si imposta un modello di colonna (se si sceglie di farlo), perché richiama fondamentalmente 'setColumnMargin()' 'sulla _current_ TableColumnModel' e 'setRowMargin()' sul 'JTable' stesso. – hendrik

1

È possibile utilizzare questi metodi in JTable al fine di rimuovere la griglia se i vostri modelli di colonna non sono di generazione automatica (senza dati vincolanti).

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

Ma se si sono creati modelli di colonne mediante associazione dati, si hanno problemi. Questo è anche se chiami questi metodi il loro è ancora bianco di vernice 1 pixel gap in ogni margine di colonna.

è possibile rimuovere tale margine colonna utilizzando DefaultTableColumnModel personalizzato.

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

Quindi è possibile aggiungere il modello di colonna di tabella personalizzato nella tabella.

setColumnModel(new CustomDefaultTableColumnModel()); 
+0

Questa è la soluzione migliore per evitare di avere quella brutta griglia di 1 pixel di colore bianco nella riga selezionata. Forse suggerirei di sovrascrivere getColumnMargin per restituire sempre 0, invece di sovrascrivere il metodo setColumnMargin, ma è molto vicino. – Ansharja

Problemi correlati