Доброго времени суток! Суть задачи, необходимо подсветить и сделать определенные действия при выделении ячейки. У таблицы, две модели выделения, одна для строк, вторая для столбцов. Все прекрасно работает пока не начинаешь выделять ячейку по какой-нибудь диагонали, происходит выделение по две.
Как это обойти? Кто с этим сталкивался.
Пример:
| Код | import java.awt.BorderLayout; import java.awt.Container;
import javax.swing.JFrame; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener;
public class TestUI extends JFrame{ private JTable table; private DataTableModel dataModel; public TestUI(){ super(); dataModel = new DataTableModel(); table = new JTable(dataModel); table.setDefaultRenderer(Object.class, new DataTableCellRenderer()); table.setCellSelectionEnabled(true); table.setRowHeight(70); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getColumnModel().getSelectionModel().addListSelectionListener( new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() && table.getSelectedRow() != -1 && table.getSelectedColumn() != -1 ) {
System.out.println("1: row=" + table.getSelectedRow()+ " col="+table.getSelectedColumn()); } } }); table.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() && table.getSelectedRow() != -1 && table.getSelectedColumn() != -1) { System.out.println("2: row=" + table.getSelectedRow()+ " col="+table.getSelectedColumn()); } } }); Container cp = getContentPane(); cp.add(BorderLayout.CENTER, table);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 600); setLocationRelativeTo(null);
} public static void main(String arg[]) {
SwingUtilities.invokeLater(new Runnable() { public void run() { new TestUI().setVisible(true); } });
} }
import java.awt.Color; import java.awt.Component;
import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.table.TableCellRenderer;
public class DataTableCellRenderer implements TableCellRenderer { private Color SELECTIONFOREGRAUNDCOLOR, SELECTIONBACKGROUNCOLOR, FOREGRAUNDCOLOR, BACKGROUNCOLOR;
public DataTableCellRenderer() {
SELECTIONFOREGRAUNDCOLOR = UIManager.getColor("Table.selectionForeground"); SELECTIONBACKGROUNCOLOR = UIManager.getColor("Table.selectionBackground"); FOREGRAUNDCOLOR = UIManager.getColor("Table.focusCellForeground"); BACKGROUNCOLOR = UIManager.getColor("Table.focusCellBackground"); }
@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int r, int c) { JLabel component = new JLabel(value.toString()); component.setOpaque(true);
if (isSelected) { component.setForeground(SELECTIONFOREGRAUNDCOLOR); component.setBackground(SELECTIONBACKGROUNCOLOR); } else { component.setForeground(FOREGRAUNDCOLOR); component.setBackground(BACKGROUNCOLOR); } return component; } }
import javax.swing.table.AbstractTableModel;
public class DataTableModel extends AbstractTableModel {
public DataTableModel() { } @Override public int getColumnCount() { return 8; }
@Override public int getRowCount() { return 8; }
@Override public Object getValueAt(int x, int y) { return x*y; } }
|
|