# Tabellenfelder Formatieren



## nippo (28. Dezember 2004)

Hallo,

ich habe eine Java JTable in der ich in einer Spalte Kommazahlen ausgebe. Wie bekomme ich es hin, dass die Stellen der Zahlen untereinander geordnet stehen (tausender unter tausender, hunderter unter hunderter....) und das immer 2 Nachkommastellen angezeigt werden (auch bei z.B.: 10,20)?

Würde mich freuen wenn mir jemand helfen könnte.

Gruß nippo


----------



## JBeni (28. Dezember 2004)

Dazu musst du wohl einen eigenen TableCellRenderer implementieren (bzw. den DefaultTableCellRenderer etwas modifizieren).

Hier hat es ein Beispiel (etwas weiter unten), wie sowas geht.


----------



## Thomas Darimont (28. Dezember 2004)

Hallo!

Meinst du sowas?

```
/*
 * Created on 28.12.2004@14:23:47
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.Component;
import java.awt.ComponentOrientation;
import java.text.DecimalFormat;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 * @author Administrator
 * 
 * TODO Explain what I do...
 */
public class JTableExample extends JFrame {

	private JTable table;

	private TableCellRenderer oldRenderer;

	public JTableExample() {
		super("");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Vector rows = new Vector();

		Vector row0 = new Vector();
		row0.add(Double.valueOf(2.334865D));
		row0.add(Double.valueOf(20.33477D));
		row0.add(Double.valueOf(200.3345D));

		Vector row1 = new Vector();
		row1.add(Double.valueOf(2.334865D));
		row1.add(Double.valueOf(200.33477D));
		row1.add(Double.valueOf(20.3345D));

		Vector row2 = new Vector();
		row2.add(Double.valueOf(200.334865D));
		row2.add(Double.valueOf(20.33477D));
		row2.add(Double.valueOf(2000.3345D));

		rows.add(row0);
		rows.add(row1);
		rows.add(row2);

		Vector headers = new Vector();
		headers.add("S0");
		headers.add("S1");
		headers.add("S2");

		table = new JTable(rows, headers);
		oldRenderer = table.getDefaultRenderer(Object.class);
		table.setDefaultRenderer(Object.class, new TableCellRenderer() {

			private JLabel jlbl = new JLabel() {
				{
					setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
				}
			};

			private DecimalFormat df = new DecimalFormat("#.00");

			public Component getTableCellRendererComponent(JTable table,
					Object value, boolean isSelected, boolean hasFocus,
					int row, int column) {
				// TODO Auto-generated method stub
				if (!(value instanceof Double))
					return oldRenderer.getTableCellRendererComponent(table,
							value, isSelected, hasFocus, row, column);

				Double d = (Double) value;
				String str = df.format(d.doubleValue());
				jlbl.setText(str);
				return jlbl;
			}
		});

		getContentPane().add(new JScrollPane(table));

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new JTableExample();
	}
}
```

Gruß Tom


----------



## shocking (17. April 2007)

Hi,

ich habe ein ähnliches Problem. Auch bei mir soll die Formatierung wie oben sein. Das Problem ist nur, dass mein TableModel nur Strings als DataValues zurückliefert.
Wie kann ich in diesem Fall die Zahlenformate entsprechend darstellen?

Mein Model sieht an der entsprechenden Stelle so aus:

```
private String[][] getDataValues(){
        String[][] result = new String[getNumberOfRows()][getNumberOfColumns()];
        
        try {
            ResultSet _res4 = _state.executeQuery("SELECT productid, description, modval, modval_alt, minlistprice," +
                    "minlistprice_alt, subid FROM tbl_products WHERE producttype ='" + _producttype + "' and catid = " + _category);
            int i = 0;
            while (_res4 != null && _res4.next()){
                int j = 0;
                
                result[i][j] = _res4.getString("productid");
                result[i][++j] = _res4.getString("description");
                result[i][++j] = _res4.getString("modval");
                result[i][++j] = _res4.getString("modVal_alt");
                result[i][++j] = _res4.getString("minlistprice");
                result[i][++j] = _res4.getString("minlistprice_alt");
                result[i][++j] = _res4.getString("subid");
                
                i++;
            }
            
            _res4.close();
        } 
        catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        return result;
    }
```

Meinen Renderer habe ich derzeit wie oben aufgebaut ;-)
So ist ja aber garkein value instanceof Double möglich...

Gruß und danke
shocking


----------



## jeipack (17. April 2007)

hi schocking

Verstehe ich dass richtig, deine Strings sehen nun so aus?
12.5
334.33
22.0
etc

nun kannst du via _Double blah = Double.valueOf("11.11");_ daraus einen Double machen. Wenn der String aber nicht genau so aussieht (z.B. Komma anstat Punkt) bekommst du eine NumberFormatException.


----------



## shocking (17. April 2007)

Ja genau. Aber halt nur zum Teil. Die values können auch so aussehen "Tagesgast" (wenn halt description o.ä.).


----------



## shocking (18. April 2007)

Hi,

habe das Problem gelöst! 
Habe aus dem String[][] im TableModel einfach ein Object[][] gemacht, und statt getSTring die jeweils getInt bzw. getDouble benutzt.
Dann passte auch die Abfrage mit dem valueof.

Gruß und Dank 
shocking


----------



## meinereiner85 (12. Februar 2008)

Hallo,

ich habe eine kurze Frage zu dem Code von Tom:

Ist schonmal einem aufgefallen, dass wenn man diesen Code verwendet, die damit formatierte Zelle ausgesparrt wird, wenn man die komplette Zeile markiert?

Hat einer eine Idee woran das liegen kann? Am SelectedBackgroud liegt es nicht.

Würde mich über einen kurzen Tipp sehr freuen.

Gruß
meinereiner85


----------

