Как сделать всплывающую подсказку для JTable?

Всплывающая подсказка для JTableНедавно заказчик попросил сделать возможность отобразить содержимое ячейки таблицы, если оно не влезет в границы, но так, что бы ни пришлось менять размеры ячеек. Вот собственно и появилась идея показывать всплывающую подсказку с текстом содержимого ячейки. В принципе в этом ничего нет сложного, простое применение объектно-ориентированного программирования. Статья будет короткая, но с примерами. Заинтересованных читателей прошу под кат.

 

И так, давайте сначала просто попробуем создать элементарную таблицу, с некоторыми произвольными данными, которая будет выводить простую подсказку со статическим текстом, например, вот такую:

Пример формы с таблицей JTable

А вот и сам код:

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

/**
 * Author: Jakeroid
 * Date: 3/20/12
 * Time: 12:09 PM
 */
public class ToolTipExample extends JFrame {
    //Класс моей таблицы
    class MyTable extends JTable {
        //Конструктор для создания таблицы из массивов данных
        public MyTable(Object[][] data, Object[] headers) {
            super(data, headers);
        }
    }
    //Массив с данными
    private Object data[][] = {
            { "Vasya", "Pupkin" },
            { "Vanya", "Ivanov" },
            { "Dima", "Oscar" },
            { "Artem", "Red" },
            { "John", "Black" }
    };
    //Массив с заголовками
    private Object headers[] = {
            "Name", "Lastname"
    };
    //Конструктор формы
    public ToolTipExample() {
        super("ToolTipExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel mainPanel = new JPanel(new GridLayout(1, 1));
        mainPanel.setBorder(BorderFactory.createTitledBorder("Table"));

        //Создаю таблицу и добавляю ее на форму
        MyTable table = new MyTable(data, headers);
        mainPanel.add(new JScrollPane(table));
        getContentPane().add(mainPanel);      

        setSize(new Dimension(250, 250));
        setVisible(true);
    }
    public static void main(String[] args) {
        new ToolTipExample();
    }
}

Я создал отдельный класс для своей таблицы. Он унаследован от JTable, но в нем ничего не переопределено, кроме конструктора, который просто вызывает конструктор прародителя. Для задания текста подсказки для нашей таблицы, нужно переопределить метод getToolTipText(…), вот пример:

        @Override
        public String getToolTipText(MouseEvent event) {
            return "This is ToolTipText!";
        }

Аргументами методы является событие мыши, и не странно, так как именно задержка мыши над таблицей провоцирует всплывающую подсказку. Сам текст подсказки возвращается как результат метода. Давай те посмотрим, что получилось:

Пример всплывающей подсказки для JTable

Как видите, работает, но пользы пока что мало. Можно сделать, что бы всплывающая подсказка отображала название столбца. Для этого изменим наш метод:

        @Override
        public String getToolTipText(MouseEvent event) {
            String result = "";
            int column = columnAtPoint(event.getPoint());
            if (column != - 1) {
                result = getColumnName(column);
            }
            return result;
        }

Сначала я получаю номер столбца, над которым находится мышь с помощью columnAtPoint(…). Потом проверяю, не равен ли он -1. Это нужно для того, что бы определить, что мышь не находится в свободном пространстве таблицы. А потом с помощью функции getColumnName(…) узнаю имя столбца.

Вот результат:

Всплывающая подсказка с именем столбца - 1

 

Всплывающая подсказка с именем столбца - 2

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

        @Override
        public String getToolTipText(MouseEvent event) {
            String result = "";
            int column = columnAtPoint(event.getPoint());
            int row = rowAtPoint(event.getPoint());
            if (column != - 1 && row != -1) {
                result = (String)getValueAt(row, column);
            }
            return result;
        }

Как видите — ничего сложного. Я просо определил номер строки, над которой находится курсор, после чего узла значение ячейки, которая находится на пересечении строки и столбца.

Удачного программирования, друзья. Задавайте свои ответы!

Комментарии 1

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *