В моем классе есть следующий метод, расширяющий JTable:
protected void setTableCursor(Cursor cursor) {
// data gathering
cursor = (cursor != null) ? cursor : Cursor.getDefaultCursor();
JTableHeader header = getTableHeader();
// set
header.setCursor(cursor);
setCursor(cursor);
}
Этот метод время от времени вызывается для отображения курсора WAIT при обновлении таблицы из БД.
Проблемас этим то, что теперь, когда я пытаюсь изменить размер столбцов, я не вижу курсора SPLIT по умолчанию.Как это можно исправить?Поэтому мне нужно добавить некоторый код для того, чтобы курсор мыши всегда отображал разделенный курсор, когда мышь находится около края столбца.
Пожалуйста, проверьте также пример ниже.Чтобы воспроизвести проблему, просто дважды щелкните заголовок таблицы точно на разделителе столбцов:
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
abstract public class DemoTable extends JTable
{
protected DemoTable() {
super();
compose(false);
}
private void compose(boolean allowMultipleSelection) {
setModel(new DefaultTableModel(getColumnNames(), 0));
setColumnSelectionAllowed(false);
getSelectionModel().setSelectionMode(allowMultipleSelection ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION);
getTableHeader().setReorderingAllowed(false);
getTableHeader().addMouseListener(new ColumnResizeListener(this));
}
protected void setTableCursor(Cursor cursor) {
// data gathering
cursor = (cursor != null) ? cursor : null;
JTableHeader header = getTableHeader();
// set
header.setCursor(cursor);
setCursor(cursor);
}
public void adjustColumnWidth(int column) {
setPreferredColumnWidth(column, getPreferredSizeForColumn(column));
}
private int getPreferredSizeForColumn(int columnIndex) {
// base setup
int preferredWidth = 0;
int rowCount = getRowCount();
TableColumnModel columnModel = getColumnModel();
TableColumn column = columnModel.getColumn(columnIndex);
TableCellRenderer renderer;
Component rendererComponent = null;
// header
renderer = column.getHeaderRenderer();
if (renderer != null) {
rendererComponent = renderer.getTableCellRendererComponent(this, column.getHeaderValue(), false, false, 0, 0);
if (rendererComponent != null) {
preferredWidth = rendererComponent.getPreferredSize().width;
}
}
// rendered values
Object value;
for (int row = 0; row < rowCount; row++) {
// base setup
value = getValueAt(row, columnIndex);
// renderer lookup
renderer = getCellRenderer(row, columnIndex);
if (renderer != null)
rendererComponent = renderer.getTableCellRendererComponent(this, value, false, false, row, columnIndex);
rendererComponent = (rendererComponent == null) ? new JLabel((value == null) ? "" : value.toString()) : rendererComponent;
// calculate the preferred size
preferredWidth = Math.max(preferredWidth, rendererComponent.getPreferredSize().width);
}
// exit
return (preferredWidth <= 0) ? 25 : (preferredWidth + 15);
}
public void adjustColumnWidths() {
Thread updateThread = new Thread()
{
public void run() {
try {
SwingUtilities.invokeAndWait(new Runnable()
{
public void run() {
int columns = getModel().getColumnCount();
Map<Integer, Integer> preferredWidths = new HashMap<Integer, Integer>();
for (int column = 0; column < columns; column++)
preferredWidths.put(column, getPreferredSizeForColumn(column));
// run the sets
for (Map.Entry<Integer, Integer> column : preferredWidths.entrySet())
setPreferredColumnWidth(column.getKey(), column.getValue());
}
});
// pause momentarily to let the cursor update take place
sleep(75);
}
catch (Exception e) {
// ignore
}
finally {
setTableCursor(null);
}
}
};
// execute the thread
updateThread.start();
if (updateThread.isAlive())
setTableCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
private void setPreferredColumnWidth(int column, int preferredWidth) {
getColumnModel().getColumn(column).setPreferredWidth(preferredWidth);
}
abstract protected String[] getColumnNames();
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
private static class ColumnResizeListener extends MouseAdapter
{
DemoTable table;
public ColumnResizeListener(DemoTable table) {
super();
// attribute initialization
this.table = table;
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() instanceof JTableHeader) {
// data gathering
int clicks = e.getClickCount();
// single click
if (clicks == 1) {
int column = table.getColumnModel().getColumnIndexAtX(e.getX());
table.adjustColumnWidth(column);
}
// double-click
else if (clicks == 2)
table.adjustColumnWidths();
}
}
}
public static void main(String args[]) {
final DemoTable table = new DemoTable() {
@Override
protected String[] getColumnNames() {
return new String[]{"one","two"};
}
};
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
((DefaultTableModel)table.getModel()).addRow(new String[]{"1", "2"});
((DefaultTableModel)table.getModel()).addRow(new String[]{"1","2"});
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(table.getTableHeader(), BorderLayout.NORTH);
panel.add(table, BorderLayout.CENTER);
frame.add(panel);
frame.pack();
panel.setSize(new Dimension(200, 100));
frame.setVisible(true);
}
}