2015-07-23 6 views
3

Я пытаюсь отобразить текст в каждой ячейке заголовка в виде подсказки при наведении курсора на эту ячейку.Текст подсказки для каждого столбца заголовка JTable

Я обнаружил, что вы можете установить подсказку для всего заголовка: table.getTableHeader().setToolTipText("asdf");, но не можете сделать то же для каждой клетки, такие как: table.getTableHeader().getColumnModel().getColumn(0).setToolTipText("asdf");

Я посмотрел на this question, но не могу понять, как переопределить getToolTipText, когда единственный способ в TableCellRenderer - getTableCellRendererComponent.

Единственный класс, который я нашел, что Хассы это getToolTipText является JComponent

+0

'getTableCellRendererComponent' возвращает' Component', именно этот компонент, на которые вы хотите установить всплывающую подсказку, внутри 'getTableCellRendererCompon ent' метод – MadProgrammer

+0

Для [пример] (http://stackoverflow.com/questions/15208884/java-is-it-possible-to-put-an-image-and-a-string-in-the-same-jtable -cell/15209900 # 15209900) и [пример] (http://stackoverflow.com/questions/31238676/tooltip-position-for-cell-in-jtable/31238769#31238769) – MadProgrammer

+0

@MadProgrammer, что 2-я ссылка идеальна, спасибо вы! если вы быстро напишете ответ, я приму его. спасибо :) – Aequitas

ответ

3

Смотрите раздел из свинга учебника по Specifying Tooltips For Column Headers.

Я бы рекомендовал этот подход, потому что каждый LAF мог иметь свой собственный визуализатор, поэтому расширение рендеринга по умолчанию не будет работать для всех LAF.

Заголовок таблицы Windows отличается от заголовка таблицы MAC, который отличается от заголовка таблицы Nimbus.

Он говорит, чтобы создать мой собственный TableHeader?

Он перекрывая код, создающий JTableHeader, так что вы можете переопределить getToolTipText(MouseEvent) метод JTableHeader так что вы можете предоставить свою собственную подсказку на основе расположения мыши. Код примера просто получает всплывающую подсказку из массива.

Смогу ли я использовать текст под мышью в качестве всплывающей подсказки?

Если вы хотите, чтобы текст заголовка вам нужно, чтобы получить TableColumnModel от JTableHeader, а затем получить TableColumn, а затем использовать getHeaderValue(), чтобы получить текст заголовка столбца.

0

Я натолкнулся на это, так как он был похож на то, что мне нужно - я хотел вставить всплывающие подсказки для заголовков столбцов. Пример демонстрационного примера Oracle, связанный с camickr включил всплывающие подсказки по дополнительному коду в создании JTable. Этот пример подтолкнул меня в правильном направлении, и я работал над этим так же, но этот способ - инициализировать новый JTable каждый раз, когда таблица была обновлена. Раньше я просто использовал myJTable.setModel() для обновления таблицы. Кроме того, пример Oracle выглядел беспорядочным и немного путался. Мне не нужно было расширять AbstractTableModel, поскольку это не выглядело так, как будто это повлияло на всплывающие подсказки.

Так как я могу получить всплывающие подсказки заголовка столбца, не создавая новый JTable каждый раз и без беспорядка? Критический код в инициализации JTable переопределял метод в JTable-защищенном JTableHeader createDefaultTableHeader(), который, конечно же, позволяет использовать заголовок таблицы (JTableHeader) с всплывающими подсказками. JTableHeader - это то, над чем я действительно хотел работать.

Что я сделал, так это то, что я создал новый класс, который расширил JTableHeader так, чтобы он включал всплывающие подсказки String в конструкторе и метод getToolTipText() (такой же, как в примере, кроме как с контуром String), а затем я сделал myJTable.setTableHeader(), чтобы установить его в экземпляр моего нового класса, который имеет всплывающие подсказки.

(Я отправляю это как ответ, так как он слишком вовлечен для комментария, но может быть полезным для других)

Вот код в моем классе GUI, когда я обновляю table-

myJTable.setModel(new javax.swing.table.DefaultTableModel(
      tableData, 
      colHeader 
     ));//setting the new data and col headers! (no tooltips yet) 

MyTableHeader headerWithTooltips = new MyTableHeader(myJTable.getColumnModel(), colHeaderTooltips);//make a new header that allows for tooltips 
myJTable.setTableHeader(headerWithTooltips);//use that header in my table 

А вот мой MyTableHeader class-

class MyTableHeader extends JTableHeader { 

    String[] tooltips; 

    MyTableHeader(TableColumnModel columnModel, String[] columnTooltips) { 
     super(columnModel);//do everything a normal JTableHeader does 
     this.tooltips = columnTooltips;//plus extra data 
    } 

    public String getToolTipText(MouseEvent e) { 
     java.awt.Point p = e.getPoint(); 
     int index = columnModel.getColumnIndexAtX(p.x); 
     int realIndex = columnModel.getColumn(index).getModelIndex(); 
     return this.tooltips[realIndex]; 
    } 
} 
+0

'Мне казалось странным создавать новый JTable каждый раз, когда таблица обновляется.' - нет необходимости создавать новый JTable. Не знаю, откуда у вас эта идея. Вы либо обновляете текущую модель, либо устанавливаете новую модель для таблицы. – camickr

+0

@camickr Ну, я последовал примеру, и это то, что он сделал, когда он включал всплывающие подсказки (нормально, только один раз, но это не помогло выяснить, как настроить всплывающие подсказки с новыми данными таблицы и заголовком). Это делается в создании JTable. --- JTable table = new JTable (новый MyTableModel()) {... Я верну его в свой ответ выше. Так мой ответ выглядит нормально? – mikato

+0

', но это не помогло выяснить, как настроить всплывающие подсказки с новыми данными таблицы и заголовком' - вам не нужно ничего делать. Этот код теперь является частью класса JTable и будет выполняться, если TableModel будет когда-либо изменен. – camickr

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