2014-11-24 4 views
0

Как я могу реализовать всплывающую подсказку, которая показывает мне для каждой ячейки подсказку, когда значение слишком велико?Показать всплывающие подсказки в JTable только при обрезании столбца

У меня просто есть средство визуализации стола, которое меня окрашивает в какую-то ячейку. Поэтому я считаю, что самый простой способ - реализовать в нем метод.

public class ColorRenderer extends DefaultTableCellRenderer { 

     final int STATUS_COL = 7; 

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

     Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 

    int modelIndex = table.convertRowIndexToModel(row); 
     String type = (String) table.getModel().getValueAt(modelIndex, 7); 

     if ("".endsWith(type)) { 
     component.setBackground(table.getBackground()); 
     component.setForeground(table.getForeground()); 


     } else { 
     component.setBackground(Color.RED); 
     component.setForeground(Color.WHITE); 

     } 
     if (isSelected) { 
     setBackground(table.getSelectionBackground()); 
     setForeground(table.getSelectionForeground()); 

     } 

     return component; 
     } 

} 

Благодарим вас заранее.

+0

Два пути я может думать о том, чтобы делать, переопределять метод getToolTip (MouseEvent) '' JTable' или 'TableCellRenderer', сравнивать размер ячейки с размером рендеринга и возвращать' null' wh en it fits или значение всплывающей подсказки, когда оно не ... – MadProgrammer

+0

см. мой ответ @MadProgrammer – okaisan1

ответ

1

Начинать с переопределения события getToolTipText(MouseEvent)JTable.

public String getToolTipText(MouseEvent e) { 
    String toolTipText = null; 

Получить координаты ячейки для данного положения мыши ...

Point p = e.getPoint(); // MouseEvent 
int col = columnAtPoint(p); 
int row = rowAtPoint(p); 

Получить клетки текущего размера, таким образом, мы знаем, что нынешние ограничения ...

Rectangle bounds = getCellRect(row, col, false); 

Получить рендер для ячейки, исходя из текущего значения для ячейки от модели ...

Object value = getValueAt(row, col); 
Component comp = prepareRenderer(getCellRenderer(row, col), row, col); 

Сравните предпочтительный размер компонента визуализатора от размера ячейки ...

if (comp.getPreferredSize().width > bounds.width) { 
    toolTipText = comp.getToolTipText(); 
} 

Возврат кончик инструмента ...

return toolTipText; 
} 
+0

да, это работает! Большое спасибо :-) Я отправляю свое решение. – okaisan1

+0

Ну, это приятное изменение ... – MadProgrammer

0

По умолчанию текст подсказки инструмента, отображаемый для ячейки таблицы, определяется средством визуализации ячейки. Тем не менее, иногда это может быть проще указать текст наконечника инструмента путем переопределения реализации JTable по методу getToolTipText (MouseEvent), так что вы можете добавить

setToolTipText(...); 

в методе getTableCellRendererComponent со значением реальной ячейки внутри так что вы получите

Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 

    int modelIndex = table.convertRowIndexToModel(row); 
     String type = (String) table.getModel().getValueAt(modelIndex, 7); 

     if ("".endsWith(type)) { 
     component.setBackground(table.getBackground()); 
     component.setForeground(table.getForeground()); 


     } else { 
     component.setBackground(Color.RED); 
     component.setForeground(Color.WHITE); 

     } 
     if (isSelected) { 
     setBackground(table.getSelectionBackground()); 
     setForeground(table.getSelectionForeground()); 

     } 
     setToolTipText(...); 
     return component; 
     } 
+0

'TableCellRenderer' не будет знать, какой размер' JTable' будет делать, когда вызывается 'getTableCellRendererComponent', это будет знаю, что это предпочтительный размер ... – MadProgrammer

0

Solution:

JTable auditTable = new JTable(){ 

    public String getToolTipText(MouseEvent e) { 

        String toolTipText = null; 
        Point p = e.getPoint(); // MouseEvent 
        int col = columnAtPoint(p); 
        int row = rowAtPoint(p); 
        Component comp = prepareRenderer(getCellRenderer(row, col), row, col); 

        Rectangle bounds = getCellRect(row, col, false); 


        try { 
         //comment row, exclude heading 
         if (comp.getPreferredSize().width > bounds.width) { 
          toolTipText = getValueAt(row, col).toString(); 
         } 
        } catch (RuntimeException e1) { 
         //catch null pointer exception if mouse is over an empty line 
        } 
        return toolTipText; 

        } 
     }; 
Смежные вопросы