title: Changing Swing JTable Cell Colors
body: <p>I'm trying to get comfortable with JTables, TableModels, JTableHeaders, renderers, etc.  I am trying to make a simple dummy table (for practice purposes) that looks like this:</p>
  
  <pre><code>-    1    2   3
  A    A1   A2  A3
  B    B1   B2  B3
  C    C1   C2  C3
  </code></pre>
  
  <p>I also want the B2 cell - and only that cell - to have a blue (Color.BLUE) background - all other cells can have the Swing default color they are assigned automagically.</p>
  
  <p>My code is below and is based off countless examples I have found on this website and the internet at large. But I am not getting the results I want. Instead I'm getting a table that looks like this:</p>
  
  <pre><code>A    A1   A2  A3
  B    B1   B2  B3
  C    C1   C2  C3
  </code></pre>
  
  <p>Notice that the first row (the header) isn't there at all.  Additionally, with the code I list below, this executes and sets the color of <strong>all</strong> the cells that color, not just the B2 cell that I want.</p>
  
  <p><strong>The code</strong>:</p>
  
  <pre><code>public class MyTable
  {
      public static void main(String[] args)
      {
          String[][] data = getTableData();
          String[] cols = getTableCols();
  
          JFrame frame = magicallyCreateJFrame();     // I promise this works!
          MyRenderer myRenderer = new MyRenderer();   // See below
  
          DefaultTableModel defModel = new DefaultTableModel(data, cols);
          JTable myTable = new JTable(defModel);
  
          myTable.setDefaultRenderer(Object.class, myRenderer);
  
          frame.add(myTable);
          frame.pack();
          frame.setVisible(true);            
      }
  }
  
  public static String[] getTableCols()
  {
      String cols =
      {
          "-",
          "1",
          "2",
          "3",
      };
  }
  
  public static String[][] getTableData()
  {
      String[][] data =
      {
          {
              "A",
              "A1",
              "A2",
              "A3",
          },
          {
              "B",
              "B1",
              "B2",
              "B3",
          },
          {
              "C",
              "C1",
              "C2",
              "C3",
          },
      };
  
      return data;
  }
  </code></pre>
  
  <p>And the quick-n-dirty <code>MyRenderer</code> class:</p>
  
  <pre><code>public class MyRenderer extends DefaultTableCellRenderer  
  { 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean   isSelected, boolean hasFocus, int row, int column) 
  { 
      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
  
      if(row == 2 &amp;&amp; column == 2)
          c.setBackground(new java.awt.Color(0, 0, 255)); 
  
      return c; 
  } 
  
  } 
  </code></pre>
  
  <p>Besides the fact that this is <em>horrible</em> code and breaks a lot of "best practices"-type patterns and techniques (remember this is just something I'm playing around with), <strong>is there anything I'm doing here that is glaringly-obvious</strong>? Why am I not getting a table header (first row "-   1   2   3")? Why is my default cell renderer not working on the specific B2 cell I am specifying?</p>
  
  <p>JTables seem to be strange, beautiful and powerful beasts. I'm slowly wrapping my mind around them but am choking on the implementation.  Thanks to any that can help!</p>