JTable einzelne Zellen färben

AndreArnold

Grünschnabel
Hallo,
ich arbeite noch nicht lange mit Swing und muss eine JTable implementieren. Wenn ich rechtsklick auf die Zellen mache geht ein PopupMenü auf, soweit klappt es dank eines eurer tutorials schon. In diesem Popup sind mehrere Funktionen hinterlegt die eigentlich nur folgendes machen sollen: die Zelle auf der der Rechtsklick erfolgte je nach Wahl der Methode
einfärben. Habe schon im FOrum rumgesucht und die Renderergeschichte gefunden. Ich steig nur leider nicht richtig dahinter, wie ich es zu implementieren habe.

Habe andere Quellen ausgenutzt und in einer steht geschrieben dass der renderer immer aufgerufen wird wenn eine tabelle darzustellen ist und seeehr viel garbage dadurch anfällt. Ich möchte aber immer nur einzelne Zellen farbig markieren lassen und die Zeilennummer in ein Array testArray[row] geschrieben wird. Das Array kann max 30 Werte aufnehmen(die JTable wird dann in der Applikation max 30 Spalten haben können).

Ich poste mal den Quelltext den ich bisher habe mit, vielleicht kann mir jemand die fehlenden 3-4 zeilen ergänzen, damit ich ein funktionierendes Beispiel habe und versuchen kann das Ganze zu verstehen.
Code:
import java.awt.Point;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author Darimont
 * 
 */
public class JTableExample 
extends JFrame 
implements MouseListener{

	private JTable table;
        private int[] testArray;

	public JTableExample() {
		super("JTableExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Object[][] rowData = { { "1", "a", "c" }, { "2", "b", "b" },
				{ "3", "f", "r" }, { "4", "q", "a" }, { "5", "w", "z" },
				{ "6", "c", "a" }, { "7", "a", "q" } };

		final Object[] columnHeaders = { "ID", "Header1", "Header2" };
                testArray = new int[30];
		table = new JTable(rowData, columnHeaders);

		table.addMouseListener(this);
                
                table.setDefaultRenderer(Object.class, new 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);
                                /*hier weiss ich nicht genau was rein muss*/
				if (true) {
					setBackground(Color.RED);
				} else {
					setBackground(Color.WHITE);
				}
				return this;
			}
		});
                
                
                
		add(new JScrollPane(table));

		pack();
		setVisible(true);
	}

	/**
	 * @param args
	 */
        public void mouseEntered(MouseEvent event) {            
        }
        
        public void mouseExited(MouseEvent event) {
        }
        
        public void mouseReleased(MouseEvent event) {
        }
        
        public void mouseClicked(MouseEvent event) {
            
        }
        
        public void mousePressed(MouseEvent event) {
				if (SwingUtilities.isRightMouseButton(event)) {
					Point p = event.getPoint();
                                        
                                        javax.swing.JPopupMenu popup = new javax.swing.JPopupMenu();
                                        
                                        javax.swing.JMenuItem shortStart = new javax.swing.JMenuItem("Short: start");
                                        shortStart.addMouseListener(this);
                                        shortStart.setName("stopStart");
                                        javax.swing.JMenuItem shortStop = new javax.swing.JMenuItem("Short: stop");
                                        shortStop.addMouseListener(this);
                                        shortStop.setName("shortStop");
                                        javax.swing.JMenuItem shortTarget = new javax.swing.JMenuItem("Short: target");
                                        shortTarget.addMouseListener(this);
                                        shortTarget.setName("shortTarget");
                                        //seperator
                                        javax.swing.JMenuItem longStart = new javax.swing.JMenuItem("Long: start");
                                        longStart.addMouseListener(this);
                                        longStart.setName("longStart");
                                        javax.swing.JMenuItem longStop = new javax.swing.JMenuItem("Long: stop");
                                        longStop.addMouseListener(this);
                                        longStop.setName("longStop");
                                        javax.swing.JMenuItem longTarget = new javax.swing.JMenuItem("Long: target");
                                        longTarget.addMouseListener(this);
                                        longTarget.setName("longTarget");
                                        
                                        popup.add(shortStart);
                                        popup.add(shortStop);
                                        popup.add(shortTarget);
                                        popup.addSeparator();
                                        popup.add(longStart);
                                        popup.add(longStop);
                                        popup.add(longTarget);
                                        
                                        popup.show(event.getComponent(),
                                                   event.getX(),
                                                   event.getY()
                                                  );

				}
                                if (SwingUtilities.isLeftMouseButton(event)) {
					//String objekt = event.getActionCommand();
                                        Point p = event.getPoint();
                                        
					int row = table.rowAtPoint(p);
					int column = table.columnAtPoint(p);
                                        
                                        String name = event.getComponent().getName();
                                        
                                        if(name.equals("shortStart")){
                                            setStart(row,column,"Short");
                                        }
                                        else if(name.equals("shortStop")){
                                           // setStop(row,column,"Short");
                                        }
                                        else if(name.equals("shortTarget")){
                                            //setTarget(row,column,"Short");
                                        }
                                        else if(name.equals("longStart")){
                                            setStart(row,column,"Long");
                                        }
                                        else if(name.equals("longStop")){
                                            //setStop(row,column,"Long");
                                        }
                                        else if(name.equals("longTarget")){
                                            //setTarget(row,column,"Long");
                                        }
                                        
                                }
                                                
					
			}
			
        private void setStart(int ebene, int wert, String seite){
            if(seite.equals("short")){
                
            }
            else {
                
            }
        }
        
	public static void main(String[] args) {
		new JTableExample();
	}
}
 
Hallo !

Würdest du z.B. folgendes an Deiner "weiß nicht weiter"-Stelle eingeben.
würden sich alle Zellen mit dem Buchstaben "a" rot färben !

Code:
if (value.toString().equals("a")) {
	setBackground(Color.RED);
} else {
	setBackground(Color.WHITE);
}

Eleganter ist es aber einen eigenen speziellen TableCellRenderer zu schreiben.
Dieser wird von javax.swing.table.TableCellRenderer abgeleitet und dem JTable
übergeben. Und ganz elegant ist dann noch eine eigene Model-Klasse die die
Daten kapselt, wenn man schon dabei ist :) !

Gruß JAdix

PS : Hoffe mit den Code-Tags ist es so richtig :)
 
Hallo,

ich würde dir raten einen CellRenderer zu schreiben, der vom DefaultTableCellRenderer abgeleitet ist. Dann brauchst du dir keine Gedanken zu machen, wie es mit dem Selektieren und so aussieht.

Java:
import java.awt.Component;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyTableCellRenderer
    extends DefaultTableCellRenderer
{

  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  {
    JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    
    //hier kannst du alles machen was du willst
    
    return label;
  }
  
}


MFG

zEriX
 
Hallo, nochmal

In so fern stimme ich zEriX natürlich zu !

Hier geht es nur um das Umfärben einzelner Zellen.
Sprich, man nimmt nicht so viele änderungen an dem von der super-Klasse
erzeugten JLabel vor.

Will man aber Felder auch im selektierten Zustand wieder farblich unterscheiden
können, macht man dem Rechner evtl. doppelte arbeit.
Zunächst berücksichtigt der DefaultTableCellRenderer alle gegebenheiten der Zelle und im
Anschluss prüft man doch erneut den Zellenwert den Focus etc. um selbst nochmal
das JLabel umzustricken. Stichwort : performance

Aber sonst ist das mit dem DefaultRenderer natürlich ne schlanke implementierung !

Gruß JAdix

PS : Nur nebenbei, anstatt add(new JScrollPane(table)) direkt,
ist getContentPane().add(new JScrollPane(table)) besser !
 
Zurück