Mehrere Tooltips in einer Tabellenzelle

mki_germo

Erfahrenes Mitglied
Hallo Leute,


ich zeige in einer Tabellenzelle mehrere Icons an. Diese symbolisieren den Status eines Datensatztes. Die Icondarstellung selber ist mit einem eigenen CellRenderer auch gar kein Problem, allerdings soll jedes Icon einen eigenen TooltipText erhalten.

ich verwende momentan folgenden Code:

Java:
package de.germo.gco21c.dbinsert.gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.net.URL;
import java.util.Iterator;
import java.util.Vector;

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

import org.jdesktop.swingx.JXLabel;
import org.jdesktop.swingx.JXPanel;

import de.germo.gco21c.dbinsert.MappingSet;
import de.germo.gco21c.dbinsert.VariableDefinition;
import de.germo.gco21c.dbinsert.models.MappingModel;

public class MappingTableCellRenderer extends DefaultTableCellRenderer {

	/** serialVersionUID */
	private static final long serialVersionUID = 7255985233079329289L;
	/** MappingModel, enthält die Daten */
	private MappingModel model = null;
	/** Vector mit den Panels, die die anzuzeigenden Icons enthält*/
	private Vector<JXPanel> iconPanels;
	
	/**
	 * Konstruktor
	 */
	public MappingTableCellRenderer() {
		model = MappingModel.getInstance();
	}

	/**
	 * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
	 * @param table Tabelle, auf die der Renderer angewendet wird
	 * @param value Zeilenwertobjekt der Tabelle
	 * @param isSelected ist die aktuelle Zelle selektiert
	 * @param hasFocus hat die Zelle momentan den Focus
	 * @param row Zeile
	 * @param column Spalte
	 */
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		if (column == 0) {
			JXPanel pnl = new JXPanel();
			pnl.setLayout(null);
			iconPanels = new Vector<JXPanel>();
			if (isSelected) {
				pnl.setBackground(table.getSelectionBackground());
				pnl.setForeground(table.getSelectionForeground());
			} else {
				pnl.setBackground(table.getBackground());
				pnl.setForeground(table.getForeground());
			}
			MappingSet mset = model.getMappingSet(row);
			if (mset.getVarISNeu().isMapped() == false) {
				addIcon("res/notMapped.png", "Variable wird nicht gemappt", pnl.getBackground());
			} else {
				if (mset.getVars21c().size() > 0) {
					addIcon("res/ok.png", "Variable ist befüllt", pnl.getBackground());
					boolean containsListNotSet = true;
					if (mset.getVarISNeu().getEnclosedVars().size() > 1) {
						addIcon("res/containsList.gif", "Enthält Variablenliste", pnl.getBackground());
						containsListNotSet = false;
					}
					int maxSize = 1;
					for (Iterator<VariableDefinition> iter = mset.getVars21c().iterator(); iter.hasNext();) {
						VariableDefinition vdef = iter.next();
						if (vdef.getEnclosedVars().size() > 1) {
							if (maxSize < vdef.getEnclosedVars().size()) {
								maxSize = vdef.getEnclosedVars().size();
							}
						}
						if (maxSize > 1) {
							if (containsListNotSet) {
								addIcon("res/containsList.gif", "Enthält Variablenliste", pnl.getBackground());
							}
						}
						if (mset.getVarISNeu().getEnclosedVars().size() > maxSize) {
							addIcon("res/warning.png", "Einige Variablen werden nicht gefüllt", pnl.getBackground());
						}
					}
				} else {
					addIcon("res/noVarMapped.png", "Keine Variable gemappt", pnl.getBackground());
				}
			}
			for (int i = 0; i < this.iconPanels.size(); i++) { 
				JXPanel tmpPanel = this.iconPanels.get(i);
				tmpPanel.setBounds((i * 16), 0, 16, 16);
				pnl.add(tmpPanel);
			}
			return pnl;
		}
		return super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
				row, column);
	}

	/**
	 * Fügt ein icon hinzu
	 * @param iconPath Pfad auf die Grafikdatei des Icons
	 * @param toolTipText zu setztender TooltipText
	 * @param background zu setzende Hintergrundfarbe
	 */
	private void addIcon(String iconPath, String toolTipText, Color background) {
		ClassLoader cl = getClass().getClassLoader();
		JXLabel tmpLbl = new JXLabel();
		tmpLbl.setSize(16, 16);
		tmpLbl.setMaximumSize(new Dimension(16,16));
		tmpLbl.setBounds(0, 0, 16, 16);
		URL url = cl.getResource(iconPath);
		tmpLbl.setIcon(new ImageIcon(url));
		JXPanel tmpPnl = new JXPanel();
		tmpPnl.setLayout(null);
		tmpPnl.setSize(16, 16);
		tmpPnl.setMaximumSize(new Dimension(16,16));
		tmpPnl.setToolTipText(toolTipText);
		tmpPnl.setBackground(background);
		tmpPnl.add(tmpLbl);
		iconPanels.add(tmpPnl);
	}
}

Die Icons werden zwar alle schön dargestellt, jedoch bekomme ich keinen ToolTipText. Wenn ich dem in getTableCellRendererComponent zurückgegebenen mit pnl.setToolTipText("Text") einen Tooltip zuweise, dann funktioniert es. Das bringt jedoch nichts, da ich ja für jedes Icon einen eigenen Text haben möchte. Jemand eine Idee, wie ich das bewerkstelligen kann?

Vielen dank schonmal für Eure Antworten.
 
Moin!
Meine Idee dabei wäre, dass du die Anfrage nach dem TooltipText von dem Panel welches für die ganze Zelle verantwortlich ist, an die einzelnen Icons weiterleitest. Das ganze in Abhängigkeit von der Position des Mauszeigers..

Mal schnell was zusammengeklickt.. ungefähr so:
Code:
/*
 * MappingTableCellRenderer.java
 *
 * Created on 23. November 2007, 10:37
 *
 */



import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

/*
 *@author jweckbach
 *
 */
public class MappingTableCellRenderer extends DefaultTableCellRenderer {
    
    public MappingTableCellRenderer() {
        
    }
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        
        if (column == 0) {
            EPanel pnl = new EPanel();
            pnl.setLayout(new GridLayout(2,1));
            
            JPanel one = new JPanel();
            JLabel lone = new JLabel(new ImageIcon("C:/one.gif"));
            one.add(lone);
            one.setBounds(0,0,200,25);
            one.setToolTipText("erstes icon");
            
            
            JPanel two = new JPanel();
            JLabel ltwo = new JLabel(new ImageIcon("C:/two.gif"));
            two.add(ltwo);
            two.setBounds(0,25,200,50);
            two.setToolTipText("zweites icon");
            
            pnl.add(one);
            pnl.add(two);
            return pnl;
            
        }
        
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column);
    }
    class EPanel extends JPanel{
        public String getToolTipText(MouseEvent event){
            Component[] cs = getComponents();
            for(Component c : cs){
                if(c.contains(event.getPoint())){
                    return ((JPanel)(c)).getToolTipText();
                }
               
            }
            return "";
            
            
        }
    }
    public static void main(String[] args) {
        JTable table = new JTable(2,2);
        table.setRowHeight(0,50);
        table.setRowHeight(1,50);
        table.setDefaultRenderer(Object.class,new MappingTableCellRenderer());
        JFrame j = new JFrame();
        JScrollPane scroll = new JScrollPane(table);
        j.setSize(300,300);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        j.getContentPane().add(scroll);
        j.setVisible(true);
    }


*grüssle*
MeinerEiner
 
Zurück