JXTable Header Tooltipps

Steven

Mitglied
Morgen!

Ich bin gerade dabei, für meine JXTable Tooltipps für die Headerzeile zu erstellen und komm nicht weiter.

Gefunden habe ich:

Java:
tabelle = new JXTable(tabellenModel);
TableColumn c = tabelle.getColumnModel().getColumn(1);
MyTestRenderer myTestRenderer = new MyTestRenderer();
c.setHeaderRenderer(myTestRenderer);

wobei

Java:
public class MyTestRenderer extends DefaultTableCellRenderer {
	@Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
      if (value != null && value instanceof Object) {

    	  JXButton jbut = new JXButton();
    	  jbut.setText(String.valueOf(value));
    	  jbut.setToolTipText("Tool Tip Text for " + String.valueOf(value));
    	  return jbut;
      }
      return component;
    }
}

Funktioniert auch ganz nett: Diese eine Column hat einen Button als Header, welcher den Tooltipp anzeigt.

Problem: Damit geht mir leider die Sortierfähigkeit der JXTable verloren, da der Button nun kein "echter" JXTable-Header mehr ist. Einen anderen passenden Datentyp habe ich dafür leider nicht gefunden.

Habt ihr Ideen?

EDIT:

Die von mir gesuchte Klasse war JXTableHeader. Es bleibt das Problem, dass ich dort den Text nicht setzen kann; jetzt wird zwar der Tooltipp angezeigt, aber nicht die Beschriftung des Head.

Java:
public class MyTestRenderer extends DefaultTableCellRenderer {
	
	private static final long serialVersionUID = 1L;

	@Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      
		Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
      
		if (value != null && value instanceof Object) {
			
			JXTableHeader header = new JXTableHeader();
			
			// TODO irgendwie Text setzen
			
			header.setToolTipText("my tooltip");
			return header;
			
		}
		return component;
    }
}
 
Zuletzt bearbeitet:
Glaube deine Herangehensweise ist nicht ganz ideal. Du erzeugst immer einen neuen JXTableHeader, obwohl die Tabelle einen bereits vorhandenen TableHeader besitzt zu diesen Zeitpunkt, wodurch er sein ursprüngliches Value verliert. Auch die Abfrage:

Java:
 ... instanceof Object
ist nicht nötig, da jede Klasse von Object erbt, und das somit immer true ist.

Darüber hinaus wäre mir nicht bekannt, dass man die Header via TableCellRenderer setzt, aber vielleicht kannte ich diesen Weg bisher auch nicht. Jedoch gibt es einen guten Guide für Tabellen im Allgemeinen unter:

How to use Tables.

Dort wird auch beschrieben wie man TableHeader Tooltips setzt. Bin nicht ganz sicher, in wie weit das unterschiedlich sein wird bei der JXTable, aber ich vermute sehr ähnlich, wenn nicht gleich.

Grüße,
ymene
 
Ja das hab ich mir auch schon durchgelesen, allerdings hatte ich Probleme, es auf JXTables zu übertragen. Nevertheless, ich les mich nochmal ein. Deine Einwände sind alle berechtigt, hier noch schnell der neueste Stand:

Java:
public class TableHeaderTestRenderer extends DefaultTableCellRenderer {
	
	private static final long serialVersionUID = 1L;

	@Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

		TableColumnModel tableColumnModel =  new DefaultTableColumnModel();
			
			TableColumn tableColumn = new TableColumn();
			tableColumn.setHeaderValue("MyHeader");
			tableColumnModel.addColumn(tableColumn);
			
			JXTableHeader header = new JXTableHeader(tableColumnModel);
			
			header.setToolTipText("my tooltip");
			return header;
    }
}

Setzt den Tooltipp und den Text richtig, jedoch verschwindet der Pfeil neben dem Namen für das Sortieren (Feature der JXTable).
 
Ja Klasse, hattest Recht: Es ist auf JXTables übertragbar. Und das auch noch viel schöner, als ich es vor hatte:

Java:
protected String[] columnToolTips = {"foo","bar"}

tabelle = new JXTable(tabellenModel) 
		{
            //Implement table header tool tips. 
            protected JTableHeader createDefaultTableHeader() {
                return new JXTableHeader(columnModel) {
                    public String getToolTipText(MouseEvent e) {
                        java.awt.Point p = e.getPoint();
                        int index = columnModel.getColumnIndexAtX(p.x);
                        int realIndex = columnModel.getColumn(index).getModelIndex();
                        return columnToolTips[realIndex];
                    }
                };
            }
        };
 
... weil JXTableHeader per-column toolTips unterstützt 🙂 Dazu mußt Du nur die Eigenschaft toolTipText in der entsprechenden TableColumnExt setzen, entweder manuell oder in einer custom ColumnFactory.

Java:
// manuell
List<TableColumn> columns = table.getColumns(true);
forEach( column ...) {
    modelIndex = column.getModelIndex();
    ((TableColumnExt) column).setToolTipText(myArray[modelIndex);
}

// custom ColumnFactory

public class MyColumnFactory {

   @Override
    public void configureTableColumn(TableModel model, TableColumnExt columnExt) {
        super.configureTableColumn(...);
columnExt.setToolTipText(myArray(columnExt.getModelIndex()));
    }
   
}

JXTable table = new JXTable();
// erst factory setzen
table.setColumnFactory(new MyColumnFactory());
// dann model setzen 
table.setModel(myModel);

am besten natürlich einen intelligenteres Lookup als diesen array implementieren - wenn Du rigoros Identifier benutzt, sind diese prima geeignet, um ganz generell Eigenschaften nachzuschlagen. SwingLabs demos hat da ein Beispiel.

Viel Spaß
Jeanette
 

Neue Themen


Zurück
Oben