вторник, 12 август 2008 г.

JTable tips - 1



Преди време ми се наложи да си поиграя с невероятната компонента JTable :) Имаше едно приложение което показваше някаква информация в голяма таблица. То беше написано на Java и потребителския му интерфейс използваше Swing (за добро или лошо). Проблемът беше, че ако текстът в някоя клетка беше твърде дълъг, просто не се събираше и не се виждаше частта която не се събира в очертанията на клетката. Тогава ми хрумна една идея, не е кой знае колко гениална, но беше решение на проблема. Накарах таблицата да показва всички записи в шрифт с еднакви по дължина символи (например Courier New) и установявах дължината на дадената колона да бъде приблизително равна на дължината на стринга на най "дългата" клетка. Получи се "нещо":)
Един друг вариант е просто да се покаже tooltip с текста на конкретната клетка, без да се променя размера на колоната в която се намира.

import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class MultiLineToolTipInsideJTableCell extends JFrame {
public static void main(String[] args) {

new MultiLineToolTipInsideJTableCell();
}

public MultiLineToolTipInsideJTableCell() {
//initilize
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
//JTable
JTable table = new JTable() {

//Implement table cell tool tips.
public String getToolTipText(MouseEvent e) {
String tip = null;
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int realColumnIndex = convertColumnIndexToModel(colIndex);

try {
if (realColumnIndex == 1 && rowIndex != 0) { //comment row, exclude heading
tip = getValueAt(rowIndex, colIndex).toString();
}
if (realColumnIndex == 2 && rowIndex != 0) { //comment row, exclude heading
tip = getValueAt(rowIndex, colIndex).toString();
}
} catch (RuntimeException e1) {
//catch null pointer exception if mouse is over an empty line
}
return tip;
}
};
//
table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
"", "", "" }) {
});

((DefaultTableModel) table.getModel()).setRowCount(4);

table.getModel().setValueAt("USERNAME", 0, 0);
table.getModel().setValueAt("DATE", 0, 1);
table.getModel().setValueAt("COMMENTS", 0, 2);

//generate table's content here
for (int i = 1; i <= 3; i++) {
table.getModel().setValueAt("User" + i, i, 0);
table.getModel().setValueAt("Date" + i, i, 1);
table.getModel().setValueAt(
"A very loooooooooooooooooooooooooooooooooooooong comment. "
+ i, i, 2);
}

//finalize
panel.add(table);
this.add(panel);
this.setSize(250, 150);
this.setVisible(true);
}
}

Няма коментари: