tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von miffi
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
239
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Morgaine21 Morgaine21 ist offline Grünschnabel
    Registriert seit
    Oct 2010
    Beiträge
    4
    Hallo Leute,

    ich weiß zu diesem Thema gibt es unglaublich viele Einträge, jedoch hab ich jetzt schon ziemlich viele durch und komme immer noch auf kein Ergebnis.

    Nun zu meinem Problem:

    Ich möchte die Schriftfarbe der Zellen meiner JTable je nach Text ändern. Hierfür habe ich folgenden Code verfasst:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    public class ScoreTableCellRender extends DefaultTableCellRenderer
     {
        private static final long serialVersionUID = 3503110144069061261L;
     
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            // TODO Auto-generated method stub
            JLabel c = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            String s = value.toString();
            
            if(s.equals("NB")){
                c.setForeground(Color.GRAY);
                c.setText((String) value);
            }
            else if(s.equals("NOK")){
                c.setForeground(Color.ORANGE);
                c.setText((String) value);
            }
            else if(s.equals("NNOK")){
                c.setForeground(Color.RED);
                c.setText((String) value);
            }
            else if(s.equals("OK")){
                c.setForeground(Color.BLACK);
                c.setText((String) value);
            }
            return c;
        }
    }

    Hier mein Modell:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    public class StatistikTabellenModell extends AbstractTableModel{
     
        private static final long serialVersionUID = -2712404378541056977L;
        
        private int ColumnCount = 1;
        private int RowCount = 1;
        private String[][] Values;
        
        public StatistikTabellenModell(int c, int r)
        {
            ColumnCount = c;
            RowCount = r + 1;
        }
     
        public int getColumnCount() {
            // TODO Auto-generated method stub
            return ColumnCount;
        }
     
        public int getRowCount() {
            // TODO Auto-generated method stub
            return RowCount;
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            // TODO Auto-generated method stub
            if(Values != null)
                return Values[rowIndex][columnIndex];
            else
                return " ";
        }
        
        public void setColumnCount(int i){
            ColumnCount = i;
            Values = new String[RowCount+1][ColumnCount];
        }
        
        public void setRowCount(int i){
            RowCount = i;
            Values = new String[RowCount+1][ColumnCount];
        }
        
        public void setValue(String[] d, String[][] a)
        {
            Values = new String[RowCount+1][ColumnCount];
            for(int i = 0; i < d.length; i++)
                Values[0][i] = d[i];
            
            for(int i = 0; i < a.length; i++){
                for (int j = 0; j < a[i].length; j++)
                    Values[i+1][j] = a[i][j];
            }
        }
    }

    Und der Teil des Hauptprogramms der relavant ist:

    Code :
    1
    2
    3
    
    ScoreTableCellRender str = new ScoreTableCellRender();
    TAnzeigeModell2.setValue(ColDate, Values2);
    TAnzeige2.setDefaultRenderer(String.class, str);

    Ich hoffe wirklich, dass ihr mir helfen könnt und bedanke mich schon mal im Vorraus.

    lg
    Morgaine21
     

  2. #2
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Howdie.

    Und was genau ist jetzt dein Problem? Ist zwar ein lustiges Ratespiel, den Code auf Fehler zu checken, aber interessant wäre eine Fehlerbeschreibung

    Gruß
    miffi
     
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

  3. #3
    Morgaine21 Morgaine21 ist offline Grünschnabel
    Registriert seit
    Oct 2010
    Beiträge
    4
    Hallo,

    die Farben ändern sich einfach nicht. Der gesamte Text in der JTable wird trotzdem in schwarz angezeigt.
     

  4. #4
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Hach ja, der gute CellRenderer... Ich hatte schon ähnliche Ansätze wie du und hab bis heute nicht verstanden, warum es auf diese Weise nicht funktioniert. Hab jetzt grad ein Projekt geöffnet, in dem ich einen CellRenderer benutze. Versuch mal direkt die Komponente zu benutzen, statt auf ein JLabel zu casten.
    Mit deinem Beispiel:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    public class ScoreTableCellRender extends DefaultTableCellRenderer
     {
        private static final long serialVersionUID = 3503110144069061261L;
     
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
     
            // wichtig, trotzdem vorher die super-Methode aufrufen!
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            String s = value.toString();
            
            if(s.equals("NB")){
                this.setForeground(Color.GRAY);
                this.setText((String) value);
            }
            else if(s.equals("NOK")){
                this..setForeground(Color.ORANGE);
                this..setText((String) value);
            }
            else if(s.equals("NNOK")){
                this..setForeground(Color.RED);
                this..setText((String) value);
            }
            else if(s.equals("OK")){
                this..setForeground(Color.BLACK);
                this..setText((String) value);
            }
            return c;
        }
    }

    Dann würde ich dir nur noch empfehlen, einen else-Zweig hinzuzufügen, falls keine der Bedingungen zutrifft. Ist zwar durch deinen Code vermutlich unwahrscheinlich, aber falls der Fall zutrifft, bleibt die Komponente komplett weiß, auch der Text.

    Gruß
    miffi

    //edit:
    Falls es dann nicht funktioniert, wird vermutlich bereits ein Fehler beim Aufbau des Tables vorliegen. Fügst du dort selbst JLabels als Cell-Komponenten hinzu?
     
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

  5. #5
    Morgaine21 Morgaine21 ist offline Grünschnabel
    Registriert seit
    Oct 2010
    Beiträge
    4
    Hab JLabel jetzt geändert und auch den zusetzlichen else - Zweig eingefügt. Hast aber nichts geholfen.

    Ich weiß nicht ob mein Modell stimmt. Den Text zeigt es ja richtig an. Sind allerdings keine JLabels sonders normal Strings. Siehe dazu meinen Code.

    P.S.: Würde es vl funktionieren wenn ich HTML Code verwende? Also wenn ich im HTML die Color angebe. Würde dies dann richtig angezeigt werden oder der HTML-Code in Klarschrift.
     

  6. #6
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Durchaus möglich, dass es an dem Model liegt. Warum benutzt du überhaupt ein eigenes? Du hast doch nur Standard-Methoden drin, oder?
    Initialisiert du das Table mit dem Model, also myTable = new JTable(myModel) ?
    Falls du nur ein Standard-Model brauchst, kannst du auch ein DefaultTableModel erzeugen und übergeben.

    HTML wird hier nicht nötig sein. Man kann zwar auf vielen Swing-Komponenten HTML zur Gestaltung verwenden, aber beim JTable gibts ja für solche Geschichten extra Renderer und sowas.
    Morgaine21 bedankt sich. 
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

  7. #7
    Morgaine21 Morgaine21 ist offline Grünschnabel
    Registriert seit
    Oct 2010
    Beiträge
    4
    Hallo,

    ich habe das Problem nun gelöst.
    Ich fange einfach alle NULL Werte ab und schon funktioniert es. Danke für die zahlreichen Tipps.

    Das mit den DefaultModell wusste ich gar nicht. Ich verwendet trotzdem lieber ein eigenes, da da ich dann schneller Änderungen vornehmen kann.
     

  8. #8
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Solche Probleme kannst du mit einem DefaultTableModel vermutlich umgehen. Du kannst ja Änderungen immer noch einfach durchführen, wenn du beispielsweise eine eigene Klasse von DefaultTableModel ableitest und die nötigen Methoden überschreibst.

    Wenn das Problem erledigt ist, markier den Thread doch bitte als gelöst.
     
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams