Недавно заказчик попросил сделать возможность отобразить содержимое ячейки таблицы, если оно не влезет в границы, но так, что бы ни пришлось менять размеры ячеек. Вот собственно и появилась идея показывать всплывающую подсказку с текстом содержимого ячейки. В принципе в этом ничего нет сложного, простое применение объектно-ориентированного программирования. Статья будет короткая, но с примерами. Заинтересованных читателей прошу под кат.
И так, давайте сначала просто попробуем создать элементарную таблицу, с некоторыми произвольными данными, которая будет выводить простую подсказку со статическим текстом, например, вот такую:
А вот и сам код:
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;
}
Как видите — ничего сложного. Я просо определил номер строки, над которой находится курсор, после чего узла значение ячейки, которая находится на пересечении строки и столбца.
Удачного программирования, друзья. Задавайте свои ответы!




спасибо, как раз искал
Рад что помог!
Кстати, зацените мой блог на английском. Ссылка в шапке.