Недавно заказчик попросил сделать возможность отобразить содержимое ячейки таблицы, если оно не влезет в границы, но так, что бы ни пришлось менять размеры ячеек. Вот собственно и появилась идея показывать всплывающую подсказку с текстом содержимого ячейки. В принципе в этом ничего нет сложного, простое применение объектно-ориентированного программирования. Статья будет короткая, но с примерами. Заинтересованных читателей прошу под кат.
И так, давайте сначала просто попробуем создать элементарную таблицу, с некоторыми произвольными данными, которая будет выводить простую подсказку со статическим текстом, например, вот такую:
А вот и сам код:
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!"; }
Аргументами методы является событие мыши, и не странно, так как именно задержка мыши над таблицей провоцирует всплывающую подсказку. Сам текст подсказки возвращается как результат метода. Давай те посмотрим, что получилось:
Как видите, работает, но пользы пока что мало. Можно сделать, что бы всплывающая подсказка отображала название столбца. Для этого изменим наш метод:
@Override public String getToolTipText(MouseEvent event) { String result = ""; int column = columnAtPoint(event.getPoint()); if (column != - 1) { result = getColumnName(column); } return result; }
Сначала я получаю номер столбца, над которым находится мышь с помощью columnAtPoint(…). Потом проверяю, не равен ли он -1. Это нужно для того, что бы определить, что мышь не находится в свободном пространстве таблицы. А потом с помощью функции getColumnName(…) узнаю имя столбца.
Вот результат:
Давайте рассмотрим еще один пример. В этот раз, как я говорил в начале статьи, всплывающая подсказка будет показывать содержимое ячейки, над которой находится курсор мыши. Это совершенно не трудно. Вот последний вариант метода:
@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; }
Как видите — ничего сложного. Я просо определил номер строки, над которой находится курсор, после чего узла значение ячейки, которая находится на пересечении строки и столбца.
Удачного программирования, друзья. Задавайте свои ответы!
спасибо, как раз искал
Рад что помог!
Кстати, зацените мой блог на английском. Ссылка в шапке.