2012-03-24 4 views
0

Ich habe den unten aufgeführten Code:Java - Hintergrundfarbe einer bestimmten Zelle Einstellung

if ("1".equals(tmp.get(h))) { 
    tmp2[0][h] = 1; 
    for (int j = 0; j < truthTable.getModel().getColumnCount(); j++) { 
     renderer = (DefaultTableCellRenderer) truthTable.getCellRenderer(0, 
      j); 
     renderer.setBackground(Color.yellow); 
    } 
} 

Die getCellRenderer Methode enthält die Parameter Zeile und Spalte und sollte die Zeile 0 mit einem gelben Hintergrund setzen, sondern es Setzt die gesamte Tabelle in einen gelben Hintergrund. Ich bin verwirrt, was ist die beste Lösung dafür?

Antwort

2

JTable-Zellen-Renderer sind keine Komponenten, sondern eher etwas für Stempel, die eine Komponente verwenden, um sich mehrfach in Ihrer JTable zu zeichnen. Wenn Sie den Hintergrund des Renderers auf Gelb setzen und nicht aufheben, wenn es nicht die interessierende Zelle ist, bleibt es beim Zeichnen von Zellen gelb.

+0

prepareRenderer können das tun, +1 – mKorbel

+0

so, was die beste Lösung für dieses sein würde? oder wie kann der Renderer nur auf eine Zelle und nicht auf die ganze Tabelle gesetzt werden? – Dave

+0

Ich werde den residenten JTable-Experten @mKorbel bitten, das Problem anzugehen, wenn es ihm nichts ausmacht. –

2

Zeigen Sie mit der Maus auf den Tisch.

package test; 

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JComponent; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class SingleCellColor { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       String[][] data = { 
         {"a", "1","2","3"}, 
         {"b", "3","4","5"}, 
         {"c", "6","7","8"} 
       }; 
       String[] columns = { 
        "Letter", "Num 1", "Num2 ", "Num 3" 
       }; 
       DefaultTableModel tableModel = new DefaultTableModel(data, columns); 

       final SingleCellRenderer renderer = new SingleCellRenderer(); 
       final JTable table = new JTable(tableModel); 
       table.setDefaultRenderer(new Object().getClass(), renderer); 
       table.addMouseMotionListener(new MouseAdapter() { 
        @Override 
        public void mouseMoved(MouseEvent me) { 
         Point p = me.getPoint(); 
         renderer.setColumnHightlight(table.columnAtPoint(p)); 
         renderer.setRowHighlight(table.rowAtPoint(p)); 
         table.repaint(); 
        } 
       }); 
       JScrollPane tableScroll = new JScrollPane(table); 

       JOptionPane.showMessageDialog(null, tableScroll); 
      } 
     }); 
    } 
} 

class SingleCellRenderer extends DefaultTableCellRenderer { 

    private static final long serialVersionUID = 1L; 

    int rowHighlight = -1; 
    int colHighlight = -1; 

    @Override 
    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); 
     c.setBackground(Color.ORANGE); 
     if (c instanceof JComponent) { 
      boolean isFocused = (colHighlight == column && rowHighlight == row); 
      ((JComponent)c).setOpaque(isFocused); 
     } 
     return c; 
    } 

    public void setColumnHightlight(int colHighlight) { 
     this.colHighlight = colHighlight; 
    } 

    public void setRowHighlight(int rowHighlight) { 
     this.rowHighlight = rowHighlight; 
    } 
} 
+1

Dies ist eine sehr gute Antwort (1+), aber es führt wieder zu dem Problem, dass Sie die Nicht-Standard-Renderer wie den Nummern-Renderer verlieren. Beachten Sie, dass alle Zahlen linksbündig sind, auch wenn Sie Ihrer DefaultTableModel-Klasse eine geeignete 'getColumnClass (...)' -Methodenüberschreibung geben. –

+0

@HovercraftFullOfEels Vielleicht hätte ich warten sollen, um zu sehen, was der Tischguru rät. ;) (Ich dachte mir nur, ich würde diesen Code zum Experimentieren rauswerfen.) –

+1

+1, im Konstruktor sind (... boolean isSelected, boolean hasFocus, int row, int column) all diese Werte sind über diese Frage, In den meisten Fällen spielt es keine Rolle, ob es (ich liebe ...) prepareRenderer oder getTableCellRendererComponent gibt, Vorteil ist, dass prepareRenderer ganze Reihe mehr easilly (für mich) hervorheben kann – mKorbel