2016-07-26 47 views
0

我正在嘗試使我的JTableHeader的工具提示顯示它所屬的列的寬度,但它不起作用。工具提示未顯示。JTableHeader的工具提示未顯示其列的寬度

這裏是我的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); 

TableHeaderTooltipWidthJTableHeader一個子類,我覆蓋的方法public String getToolTipText(MouseEvent e),看完後Official Tutorial How to use Tool tips

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()); 
    } 
} 

但是工具提示沒有顯示。任何幫助,將不勝感激。謝謝!

+1

你有沒有註冊tootip組分TooltipManager.registerComponent()? – agilob

+0

我不知道該怎麼做,教程也沒有提到它。請回答如果你知道更多關於它。 [Doc](https://docs.oracle.com/javase/7/docs/api/javax/swing/ToolTipManager.html#registerComponent(javax.swing.JComponent))說:**爲工具提示管理註冊一個組件。這將註冊鍵綁定以僅在組件具有焦點綁定時顯示和隱藏工具提示文本。這樣做是爲了讓通常不會焦點遍歷的組件(如JLabel)不會因爲調用此方法而成爲焦點可移動的。**我不知道它是否令人感到敬意。 – FaithReaper

+0

在這裏提及你@agilob – FaithReaper

回答

2

...閱讀官方教程如何使用工具提示後。

還檢查了: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

感謝您的回覆,我現在明白您的意思是我必須將'JTableHeader'封裝到'JTable'的用戶定義的子類中,並實現其'createDefaultTableHeader()'。以及'getToolTipText()'使其工作。您的代碼單獨工作,但是在將代碼集成到代碼中之後,我的表格完全消失了。在你的參考文獻中,我發現了更多的方法在'class MyTableModel extends AbstractTableModel'中實現,這在我的情況下太多了,並且是不必要的。因此,我放棄了在工具提示中看到列寬的想法,並使用屏幕標尺來實現此目的。 – FaithReaper

0

你需要使用鼠標協調和計算出鼠標的位置根據你的表頭需要一個良好的數學方程式做

+0

我認爲'int col = columnAtPoint(e.getPoint());'我已經實現了這個。在[DOC]中(https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html#columnAtPoint(java.awt.Point))它說'columnAtPoint()**返回指向的列的索引,如果結果不在範圍[0,getColumnCount() - 1]中,則返回-1。這是協調,還是我錯了? – FaithReaper

+0

如果你嘗試它,它的工作,這意味着好的數學方程是在這種方法,有些人沒有它,然後使用它,我沒有尋找一個解決方案,我只是給你很好不,你也幫助我也是這個評論謝謝 – Cherif

+0

啊,說「我已經存檔了」,我的意思是「我認爲我得到了協調,但工具提示仍然丟失,所以問題不是沒有得到協調」。對於誤導評論感到抱歉。 – FaithReaper