CellRenderer funkt net

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo Leutz!!!

Ich habe relativ simple Frage: Was mache ich falsch? ;-)

Code:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.text.DecimalFormat;
import java.util.*;
import java.util.GregorianCalendar.*;
import java.util.Date.*;

public class DepotCellRenderer extends JLabel implements TableCellRenderer{
  public DepotCellRenderer(){
    setOpaque(true);
  }
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    int[] breite = {20,9,10,11,5,5,7,7,10,10,7,2};
    int[] ausrichtung = {SwingConstants.LEFT,SwingConstants.CENTER,SwingConstants.CENTER,SwingConstants.RIGHT,
SwingConstants.LEFT,SwingConstants.CENTER,SwingConstants.RIGHT,SwingConstants.RIGHT,
SwingConstants.RIGHT,SwingConstants.RIGHT,SwingConstants.RIGHT,SwingConstants.CENTER};
    table.getColumnModel().getColumn(column).setPreferredWidth(breite[column]);
    table.setShowGrid(false);
    table.setShowHorizontalLines(true);
    setHorizontalAlignment(ausrichtung[column]);
    
    int klasse = -1;
    if (value instanceof String)  klasse = 0;
    if (value instanceof Integer) klasse = 1;
    if (value instanceof Boolean) klasse = 2;
    if (value instanceof Double)  klasse = 3;
    if (value instanceof Date)    klasse = 4;
    
    switch(klasse){
      case 0:   stringView((String)value);
                return this;
      case 1:   integerView((Integer)value);
                return this;
      case 2:   booleanView((Boolean)value);
                return this;
      case 3:   doubleView((Double)value);
                return this;
      case 4:   dateView((Date)value);
                return this;
      default:  setText(value.toString());
                return this;
    }
  }
  public void doubleView(Double dv){
    DecimalFormat df = new DecimalFormat("#,###.00");
    if (dv<=0.0) setForeground(Color.RED);
      else setForeground(Color.GREEN);
    setText(df.format(Math.round(dv*100.)/100.));
  }
  public void dateView(Date dv){
    GregorianCalendar past = new GregorianCalendar();
    GregorianCalendar today = new GregorianCalendar();
    past.setTime(dv);
    today.setTimeInMillis(System.currentTimeMillis());
    if (today.YEAR-past.YEAR>=1){
      if(today.DAY_OF_MONTH-past.DAY_OF_MONTH>=1){
        if(today.MONTH-past.MONTH>=1){
          setForeground(Color.GREEN);
          setText(dv.toString());
        }
      }
    }
  }
  public void stringView(String sv){
    if (sv.length()>20){
      setForeground(Color.BLACK);
      setText(sv.substring(0,20)+"\n"+sv.substring(20,sv.length()));
    }
  }
  public void integerView(int iv){}
  public void booleanView(Boolean bv){}
}
Folgendes bekomme ich:
- Die Stringspalten sind zu eng und in der Größe aneinander gebunden. :-(
- Die Farbunterscheidung ist nicht zu sehen
- Strings erscheinen Fett
- Andere Spalten sind zu breit, obwohl sie eng gedacht wurden
- Zahlenformatierung funktioniert nicht.
- Ausrichtung funktioniert nicht

Kann mir hier jemand etwas helfen? Es wäre sehr freundlich. Danke.

Gruß

Taik


PS: Ich bin ein blutiger Anfänger, was Java Programmierung betrifft. Also bitte etwas mehr Geduld. Danke. ;-)
 
B

Beni

Gast
Uh, soviele Fragen mach ja Angst.

1. Verschieb mal alle "table.setIrgendwas..."-Methoden aus dieser "getTableCellRendererComponent"-Methode. Die "getTableCellRenderer..." wird sehr oft aufgerufen, und diese set... sind machen das Progi nicht schneller :wink:

2. Breite der Spalten, mehr kann ich dir dazu auch nicht sagen. Vielleicht sind einfach deine Werte unglücklich gewählt?

3. Das JLabel hat im Default-LookAndFeel eine fette Schrift. Du kannst mal ausprobieren was passiert, wenn du "setFont" aufrufst (z.B. mit "new Font( Monospaced, ... )". Guck in die API um die anderen Parameter rauszufinden. (Was du auchmal ausprobieren kannst, ist "setFont( table.getFont() )").

4. Zur Ausrichtung, guck dir dies an. Da ist Quellcode dabei, eigentlich sollte es reichen, wenn du da die Einstellungen rauskopierst (obwohl, das sieht ziemlich ähnlich aus wie das was du machst. ???:L )
 

taik84

Mitglied
Ich habe Deine Empfehlungen (außer 1.) wie ich konnte umgesetzt doch leider funktioniert bei mir immer noch nicht folgendes:

- Die Farbunterscheidung ist nicht zu sehen beim Date und Double
- Zahlenformatierung funktioniert nicht
- Ausrichtung funktioniert nicht

Kannst Du oder jemand mir helfen, das auch zu lösen. Danke.

Gruß

Taik

PS:
TableModel : getColumnClass(int col)

Code:
  public Class getColumnClass(int index){
    try {
      switch (index) {
        case 0:   return Class.forName("java.lang.String");
        case 1:   return Class.forName("java.lang.String");
        case 2:   return Class.forName("java.util.Date");
        case 3:   return Class.forName("java.lang.Double");
        case 4:   return Class.forName("java.lang.String");
        case 5:   return Class.forName("java.lang.Integer");
        case 6:   return Class.forName("java.lang.Double");
        case 7:   return Class.forName("java.lang.Double");
        case 8:   return Class.forName("java.lang.Double");
        case 9:   return Class.forName("java.lang.Double");
        case 10:  return Class.forName("java.lang.Double");
        case 11:  return Class.forName("java.lang.Boolean");
        default:  return null;
      }
    } catch (Exception e) {return null;}
  }
 
B

Beni

Gast
Zur Farbunterscheidung: JLabels sind per Default durchsichtig. Das kannst du mit "setOpaque( true )" abschalten, dann sollte der Hintergrund (mit den verschiedenen Farben) gezeichnet werden.

Zu der "getColumnClass", das kann man mit weniger Code hinkriegen (und vorallem ohne die Gefahr einer Exception):
Code:
  public Class getColumnClass(int index){
      switch (index) {
        case 0:   
        case 1:   
        case 4:   return String.class;

        case 2:   return Date.class;

        case 3:
        case 6:   
        case 7:   
        case 8:   
        case 9:   
        case 10: return Double.class;

        case 5: return Integer.class;

        case 11: return Boolean.class;
        default:  return null;
      }
  }

Zahlenformatierung funktioniert nicht
Was meinst du genau mit "funktioniert nicht"? Ich habe diese Teilchen mal laufen lassen, und das Resultat war formatiert.
 

taik84

Mitglied
Ich habe die Zeile weggenommen, aber es zeigt nicht das, was ich wünsche (was ich oben aufgezählt habe)

Gruß

Taik

PS: "funktionier nicht" : heißt anstatt 10,67 zeigt es mir 10,667 oder anstatt 10,00 zeigt es mir 10
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
S Verständnisproblem mit CellRenderer AWT, Swing, JavaFX & SWT 1
M Swing Jtable CellRenderer Parameter uebergeben AWT, Swing, JavaFX & SWT 4
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
J JTable: Problem bei CellRenderer AWT, Swing, JavaFX & SWT 3
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
Spin CellRenderer Probleme bei JList AWT, Swing, JavaFX & SWT 4
S Swing Jlist - CellRenderer/ Selektion AWT, Swing, JavaFX & SWT 2
B JTable CellRenderer AWT, Swing, JavaFX & SWT 5
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
C Wieso funktionert der CellRenderer nicht? AWT, Swing, JavaFX & SWT 2
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
E Swing JTable mit CellRenderer AWT, Swing, JavaFX & SWT 7
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
? Tabelle formatieren - auch ohne CellRenderer? AWT, Swing, JavaFX & SWT 6
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
H JTable und CellRenderer AWT, Swing, JavaFX & SWT 2
M CellRenderer in JTable AWT, Swing, JavaFX & SWT 11
D JList Cellrenderer fügt mehrfach ein AWT, Swing, JavaFX & SWT 2
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
K Verständnisfrage zum CellRenderer AWT, Swing, JavaFX & SWT 4
G [Problem] CellRenderer und ActionCommand AWT, Swing, JavaFX & SWT 5
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
G CellRenderer, der einige ImageIcons aneinanderreiht AWT, Swing, JavaFX & SWT 5
G JTable: Zellenhöhe mit neuem CellRenderer & Editor AWT, Swing, JavaFX & SWT 17
T CellRenderer funzt net AWT, Swing, JavaFX & SWT 20
F JTable CellRenderer über boolean AWT, Swing, JavaFX & SWT 12
M Krieg keine CellRenderer Methode hin :( AWT, Swing, JavaFX & SWT 12
C JTable mit JPanel als CellRenderer AWT, Swing, JavaFX & SWT 2
G JTable CellRenderer-Problem AWT, Swing, JavaFX & SWT 4
B Navigation funkt nicht richtig AWT, Swing, JavaFX & SWT 3
S n-e-w JLabel(n-e-w ImageIcon(i)) funkt. nicht im JScrollPane AWT, Swing, JavaFX & SWT 2
R KeyListener funkt. nach austauschen der Panels nicht mehr? AWT, Swing, JavaFX & SWT 2
T Programm funkt. nicht - Exception AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen


Oben