2017-08-10 1 views
1

Ich wollte die 7 Reihen in meinem Fall mit allen verschiedenen Farben färben, aber es ist nicht ganze Reihe aber nur erste Spalte Färbung ...Wie wird die Farbe in einer Zeile mit Hilfe von hashMap gesetzt?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

public class UsingHashTable extends JFrame { 
    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Object rowData[][] = { 
      { "Row1", "Row1", "Row1" }, 
      { "Row2", "Row2", "Row2" }, 
      { "Row3", "Row3", "Row3" }, 
      { "Row4", "Row4", "Row4" }, 
      { "Row5", "Row5", "Row5" }, 
      { "Row6", "Row6", "Row6" }, 
      { "Row7", "Row7", "Row7" } 
     }; 
     Object columnNames[] = { "Column One", "Column Two", "Column Three" }; 
     JTable table = new JTable(rowData, columnNames); 

     JScrollPane scrollPane = new JScrollPane(table); 
     table.setDefaultRenderer(Object.class, new Renderit()); 
     frame.add(scrollPane, BorderLayout.CENTER); 
     frame.setSize(300, 150); 
     frame.setVisible(true); 
    } 
} 

Here I Klasse machen bin mit dem Job und initialisieren Sie die Karte zu tun dann verwende ich den Schlüssel für die Zeile zu überprüfen, aber es ist nicht zu helfen ...

class Renderit extends DefaultTableCellRenderer { 
    Map<Integer, Color> map = new HashMap<>(); 

    public renderit() { 
     map.put(0, Color.blue); 
     map.put(1, Color.yellow); 
     map.put(2, Color.red); 
     map.put(3, Color.green); 
     map.put(4, Color.pink); 
     map.put(5, Color.orange); 
     map.put(6, Color.magenta); 
    } 

    @Override 
    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 
     ); 

     for(Map.Entry<Integer, Color> enp : map.entrySet()) { 
      int key = enp.getKey(); 

      if(key==row) { 
       table.setBackground(enp.getValue()); 
      } else if(key==row) { 
       table.setBackground(enp.getValue()); 
      } else if(key==row) { 
       table.setBackground(enp.getValue()); 
      } else if(key==row) { 
       table.setBackground(enp.getValue()); 
      } else if(key==row) { 
       table.setBackground(enp.getValue()); 
      } else if(key==row) { 
       table.setBackground(enp.getValue()); 
      } else if(key==row) { 
       table.setBackground(enp.getValue()); 
      } 
     } 
     return comp; 
    } 
} 

ich weiß nicht, wo ich mache Fehler bitte helfen.

+2

Unrelated auf Ihre Frage, aber warum haben Sie eine Kette von 7' if-anderes 's wenn sie alle den gleichen Zustand haben? –

Antwort

2

Der Fehler liegt in der getTableCellRendererComponent Methode Ihrer Renderit Klasse.

  1. Wie @ElanHamburger bereits erwähnt, Sie 7 haben if/else-Zweige alle das gleiche tun. Nur ein if-Zweig würde den gleichen Effekt haben.
  2. Sie legen den Hintergrund des gesamten table. Stattdessen sollten Sie den Hintergrund nur der CellRendererComponent comp festlegen.

Alles in allem können Ihre korrigiert Methode wie folgt aussehen:

@Override 
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); 

    for (Map.Entry<Integer, Color> enp : map.entrySet()) { 
     int key = enp.getKey(); 

     if (key == row) { 
      comp.setBackground(enp.getValue()); 
     } 

    } 

    return comp; 
} 

Während der obige Code sicherlich richtig funktioniert, es ist noch komplizierter als nötig. Sie müssen nicht durchlaufen HashMap mit einer handgeschriebenen for Schleife. Stattdessen können Sie einfach die HashMap verwenden ‚s get Methode, für ein gegebenes row die nach Color zu finden:

@Override 
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); 

    Color color = map.get(row); 
    if (color != null) { 
     comp.setBackground(color); 
    } 

    return comp; 
} 
+0

Danke .... es funktioniert – anrdggle

+0

Aber können Sie bitte sagen, warum haben Sie nicht verwendet table.paint(); und wann es zu benutzen ....? – anrdggle

+0

@anrdggle Der TableCellRenderer (genauer: der, den Sie von 'super.getTableCellRendererComponent' erhalten haben) übernimmt die Bemalung für Sie. In Swing nennst du nie 'Farbe' alleine. Stattdessen verlassen Sie sich darauf, dass Swing zu bestimmten Zeiten "Farbe" nennt. Aber das ist eine andere (und sehr große) Geschichte. Googeln Sie einfach nach ["swing paint"] (https://www.google.de/search?q=swing+paint) und Sie werden viele ausgezeichnete Artikel finden. –

Verwandte Themen