2016-07-26 10 views
0

Ich versuche, den Tooltip meiner JTableHeader zeigt die Breite der Spalte es gehört, aber es funktioniert nicht. Der Tooltip wird nicht angezeigt.Tooltips von JTableHeader zeigt nicht die Breite seiner Spalte

Hier ist mein JTableHeader:

myTable.setModel(new DefaultTableModel(new Object[][] {{ label1, label2, label3, label4} }, 
new String[] { "foo", "bar", "foo bar", "bar foo" })); 

final JTableHeader header = new TableHeaderTooltipWidth(myTable.getColumnModel()); 
header.setReorderingAllowed(false); 
header.setResizingAllowed(true); 

TableHeaderTooltipWidth ist eine Unterklasse von JTableHeader, wo ich die Methode überschreiben public String getToolTipText(MouseEvent e), nachdem die Official Tutorial How to use Tool tips lesen.

package gui.paneles.elementos; 

import java.awt.event.MouseEvent; 

import javax.swing.table.JTableHeader; 
import javax.swing.table.TableColumnModel; 

public class TableHeaderTooltipWidth extends JTableHeader { 

private static final long serialVersionUID = 1L; 

public TableHeaderTooltipWidth() { 

} 
public TableHeaderTooltipWidth(TableColumnModel model) { 
    super(); 
} 

    @Override 
    public String getToolTipText(MouseEvent e) { 
     int col = columnAtPoint(e.getPoint()); 
     return String.valueOf(this.getColumnModel().getColumn(col).getPreferredWidth()); 
    } 
} 

Aber die Tooltips wird nicht angezeigt. Jede Hilfe wäre willkommen. Vielen Dank!

+1

Haben Sie tootip-Komponente TooltipManager.registerComponent() registriert? – agilob

+0

Ich weiß nicht, wie ich es tun soll, noch hatte das Tutorial es erwähnt. Bitte antworten Sie, wenn Sie mehr darüber wissen. Der [Doc] (https://docs.oracle.com/javase/7/docs/api/javax/swing/ToolTipManager.html#registerComponent (javax.swing.JComponent)) sagt: ** Registriert eine Komponente für das Tooltip-Management . Dadurch werden Tastenbindungen registriert, um den Tooltip-Text nur dann anzuzeigen und auszublenden, wenn die Komponente Fokusbindungen aufweist. Dies geschieht, damit Komponenten, die normalerweise nicht fokusierbar sind, wie z. B. JLabel, nicht durch den Aufruf dieser Methode fokusverfahrbar gemacht werden. ** Ich weiß nicht, ob es offen ist. – FaithReaper

+0

Hier zu erwähnen @agilob – FaithReaper

Antwort

2

..., nach den offiziellen Tutorial lesen Wie Tooltips verwenden .

Sie auch: Specifying Tool Tips for Column Headers - How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableHeaderTooltipWidthTest { 
    public JComponent makeUI() { 
    TableModel model = new DefaultTableModel(
     new Object[][] {{ "label1", "label2", "label3", "label4"} }, 
     new String[] { "foo", "bar", "foo bar", "bar foo" }); 
    // How to Use Tables (The Java™ Tutorials) 
    // Specifying Tool Tips for Column Headers 
    // https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#headertooltip 
    JTable table = new JTable(model) { 
     //Implement table header tool tips. 
     @Override protected JTableHeader createDefaultTableHeader() { 
     return new JTableHeader(columnModel) { 
      @Override public String getToolTipText(MouseEvent e) { 
      int col = columnAtPoint(e.getPoint()); 
      return String.valueOf(getColumnModel().getColumn(col).getPreferredWidth()); 
      //int index = columnModel.getColumnIndexAtX(e.getPoint().x); 
      //int realIndex = columnModel.getColumn(index).getModelIndex(); 
      //return String.valueOf(columnModel.getColumn(realIndex).getPreferredWidth()); 
      } 
     }; 
     } 
    }; 
    return new JScrollPane(table); 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new TableHeaderTooltipWidthTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+0

Danke für die Antwort, ich verstehe jetzt, dass Sie meinen, dass ich den 'JTableHeader' in eine benutzerdefinierte Unterklasse von' JTable' einbinden muss, indem ich 'createDefaultTableHeader()' implementiere. zusammen mit 'getToolTipText()', damit es funktioniert. Ihr Code funktioniert individuell, aber nachdem Sie Ihren Code in meinen Code integriert haben, ist meine Tabelle komplett verschwunden. In Ihrer Referenz fand ich mehr Methoden, die implementiert werden sollten in der Klasse MyTableModel extends AbstractTableModel, was in meinem Fall zu viel zu tun und unnötig ist. Daher habe ich die Idee, die Spaltenbreite im Tooltip zu sehen, aufgegeben und benutze ein Bildschirmlineal, um dies zu erreichen. – FaithReaper

0

müssen Sie Maus Koordination verwenden und die Position der Maus berechnen nach Ihrem Tabellenkopf braucht eine gute mathematische Gleichung zu tun, dass

+0

Ich denke nach 'int col = columnAtPoint (e.getPoint());' Ich habe das erreicht. In [DOC] (https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html#columnAtPoint (java.awt.Point)) steht über 'columnAtPoint()' ** Gibt den Index der Spalte zurück, in der dieser Punkt liegt, oder -1, wenn das Ergebnis nicht im Bereich [0, getColumnCount() - 1] liegt. **. Es wird koordiniert, oder liege ich falsch? – FaithReaper

+0

Wenn Sie es versuchen und es funktioniert, bedeutet das, dass die gute mathematische Gleichung in dieser Methode ist und einige hat es dann verwenden Sie ich suchte nicht nach einer Lösung, ich gide Sie einfach schön don Sie half mir auch von diesem Kommentar danke – Cherif

+0

Ah, indem ich sage "Ich habe das archiviert" meinte ich "Ich denke, ich habe die Koordination bekommen, aber der Tooltip fehlt noch, also ist es nicht das Problem, die Koordination nicht zu bekommen". Entschuldigung für den irreführenden Kommentar. – FaithReaper