# JTable Zelle Padding



## antion (8. Dez 2009)

Hallo,

ich würde gerne den Text in der ersten Spalte meiner JTable um ein paar Pixel einrücken. Zuerst habe ich es damit versucht, einfach drei Leerzeichen vor den Text zu setzen, allerdings klappt das nicht, wenn der Text länger ist als die Zelle und er automatisch abkürzt... irgendwie ersetzt er dann die Leerzeichen.

Weiß jemand, wie ich das machen kann?


----------



## KrokoDiehl (8. Dez 2009)

Du könntest für diese Spalte einen eigenen Renderer schreiben oder 
	
	
	
	





```
prepareRenderer()
```
 der Tabelle überschreiben und es mit einer _EmptyBorder _probieren, die nur links eine Breite hat.


----------



## Ebenius (8. Dez 2009)

Wenn das für alle Spalten passieren soll, dann nimm einfach [c]table.getColumnModel().setColumnMargin(5);[/c]. Wenn nicht, dann ist Border der richtige Ansatz. Allerdings nicht prepareRenderer überschreiben. Sonden einen eigenen Renderer bauen, der einen breiteren Border hat als gewöhnlich. Wenn die Zellen editierbar sind, denk auch an den Editor; der sollte möglichst nicht versetzt zum Renderer aufgehen, weil das blöd aussieht. Achtung: Du musst die Standard-Borders des TableCellRenderers weiter verwenden und einen CompoundBorder nutzen, der als inneren Border Deinen Abstandhalter hat. Nicht einfach den Border ersetzen, ansonsten hast Du beispielsweise keine Fokus-Markierung mehr.

Ebenius


----------



## antion (8. Dez 2009)

Hallo KrokoDiehl,
Soweit war ich schon, leider hab ich das selbst irgendwie nicht hinbekommen. Könntest du mir ein Code-Bsp. geben?


----------



## Ebenius (8. Dez 2009)

*vordrängel*


```
/* (@)CellMarginRendererFun.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Insets;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.table.TableCellRenderer;

public class CellMarginRendererFun {

  static class CellMarginRenderer extends CompoundBorder
    implements TableCellRenderer {

    /** Serial version UID */
    private static final long serialVersionUID = 1L;
    private final TableCellRenderer renderer;

    public CellMarginRenderer(TableCellRenderer renderer, Insets insets) {
      if (insets == null) {
        throw new IllegalArgumentException("insets not allowed null");
      }
      if (renderer == null) {
        throw new IllegalArgumentException("renderer not allowed null");
      }
      this.renderer = renderer;
      this.insideBorder =
            BorderFactory.createEmptyBorder(insets.top, insets.left,
                  insets.bottom, insets.right);
    }

    public Component getTableCellRendererComponent(
          JTable table,
          Object value,
          boolean isSelected,
          boolean hasFocus,
          int row,
          int column) {
      final Component comp =
            renderer.getTableCellRendererComponent(table, value, isSelected,
                  hasFocus, row, column);
      if (comp instanceof JComponent) {
        final JComponent jcomp = (JComponent) comp;
        final Border orgBorder = jcomp.getBorder();
        this.outsideBorder = orgBorder;
        jcomp.setBorder(this);
      }
      return comp;
    }
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final JTable table = new JTable(10, 10);
    table.setDefaultRenderer(Object.class, new CellMarginRenderer(table
          .getDefaultRenderer(Object.class), new Insets(0, 5, 0, 2)));
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(new JScrollPane(table));

    final JFrame f = new JFrame("Test Frame: CellPaddingRendererFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
```
Ebenius


----------



## KrokoDiehl (8. Dez 2009)

Ebenius' Hinweis ist wesentlich hilfreicher 

```
public class MeinBesondererRenderer extends DefaultTableCellRenderer
{
    public Component getTableCellRendererComponent(JTable table, Object value,
                          boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, 
            hasFocus, row, column);

        if (table.convertColumnIndexToModel(column) == meineBesondereSpalte)
        {
            Border defaultBorder = ((JComponent)comp).getBorder();

            // hier gehört dein Code hin, Eimerchen und Schäufelchen hast du nun ;)
        }

        return comp;
    }
}
```

 ........boaaah


----------



## antion (8. Dez 2009)

Hey, danke euch beiden für die Hilfe... wieso muss das eigentlich immer so lange und kompliziert sein? 

Auf eure Anregung hin, habe ich das etwas kürzer gemacht:


```
public class myRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setForeground(table.getForeground());
            if (isSelected) {
                setBackground(table.getSelectionBackground());
                setForeground(table.getSelectionForeground());
            } else
                setBackground(table.getBackground());

            //Einrücken
            Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            Border defaultBorder = ((JComponent)comp).getBorder();
            defaultBorder =  BorderFactory.createEmptyBorder(0, 10, 0, 0);
            this.setBorder(defaultBorder);

            setValue(value.toString());
            return this;
        }
    }
```


----------



## antion (8. Dez 2009)

Achja, das habe ich noch vergessen 


```
TableFiles.getColumnModel().getColumn(0).setCellRenderer(new myRenderer());
```

Dann wird der obige Code nur für die erste Spalte genutzt


----------



## KrokoDiehl (9. Dez 2009)

Moin.
Du musst Ebenius' Hinweis noch beachten und eine _CompoundBorder_ benutzen, weil so überschreibst du die eigentliche vom Renderer (_defaultBorder _bei dir). Wenn eine Zelle z.B. fokussiert ist, hat sie z.B. einen gelben, gestrichelten Rahmen (zumindest bei manchen L&F's), die verlierst du mit deiner Lösung.
Und Klassennamen schreibt man mit beginnendem Großbuchstaben


----------



## Ebenius (9. Dez 2009)

Kopier Dir doch einfach aus meinem Code oben den MarginCellRenderer. Der funktioniert prächtig.

Ebenius


----------

