
Эксперт
  
Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006
Репутация: 4 Всего: 40
|
Здравствуйте, уважаемые. Задача: сделать таблицу, которая в ячейках содержит любые компоненты. Не так страшно, но дошло дело до обработки событий, и здесь встала проблема. Все события работают вроде нормально, но события ввода курсора над компонентом и выхода из компонента работают ниже удовлетворительного, и вообще временами возникает залипание кнопок при перетаскивании курсора. Прошу ГУИ мастеров помочь, или подкорректировать работу. Нет сил больше продолжать насиловать себя. Показываю результаты работы. | Код | package platon.gui.swing.table;
import javax.swing.*; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; import javax.swing.table.TableColumnModel; import javax.swing.table.TableCellEditor; import java.awt.*; import java.awt.event.*; import java.util.Vector; import java.util.EventObject;
public class WidgetTable extends JTable {
public WidgetTable() { init(); }
public WidgetTable(TableModel dm) { super(dm); init(); }
private void init() { setDefaultRenderer(Object.class, new WidgetRenderer()); TableMouseListener l = new TableMouseListener(this); addMouseListener(l); addMouseWheelListener(l); addMouseMotionListener(l); //TODO: исключить редактирование!!! setCellEditor(new DefaultCellEditor(new JCheckBox()) { public boolean isCellEditable(EventObject anEvent) { return false; }
public boolean stopCellEditing() { return false; }
public boolean shouldSelectCell(EventObject anEvent) { return false; } }); }
public WidgetTable(int numRows, int numColumns) { super(numRows, numColumns); init(); }
public WidgetTable(Vector rowData, Vector columnNames) { super(rowData, columnNames); init(); }
public WidgetTable(Object[][] rowData, Object[] columnNames) { super(buildRowData(rowData), buildColumnData(columnNames)); init(); }
private static Vector buildRowData(Object[][] rowData) { Vector<Vector> v = new Vector<Vector>(); for (Object[] o : rowData) { Vector vv = new Vector(); for (Object oo : o) vv.add(oo); v.add(vv); } return v; }
private static Vector buildColumnData(Object[] columnNames) { Vector c = new Vector(); for (Object o : columnNames) c.add(o); return c; }
private static Component buildPanel() { JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); JButton b; p.add(new JButton("Привет!!!")); p.add(b = new JButton("Пока!!!")); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Пока!!!"); } }); return p; }
public static void main(String[] args) { final JButton b = new JButton("Привет!"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("clicked"); } }); b.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { System.out.println("Wheeled!!!" + b.getText()); } }); Component c = buildPanel(); JTable t = new WidgetTable(new Object[][] {{buildPanel(), b}}, new Object[]{"Тест", "Лейблы"}); t.setRowHeight((int)c.getPreferredSize().getHeight()); JFrame f = new JFrame(); f.getContentPane().add(new JScrollPane(t)); f.pack(); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
class TableMouseListener implements MouseListener, MouseMotionListener, MouseWheelListener {
private JTable table;
public TableMouseListener(JTable table) { this.table = table; }
public void mouseClicked(MouseEvent e) { dispatchEvent(e); }
private void dispatchEvent(MouseEvent e) { Point p = e.getPoint(); Object o = getElementAt(e.getPoint()); if (o instanceof Component) { Component c = (Component)o; Rectangle r = table.getCellRect(table.rowAtPoint(p), table.columnAtPoint(p), false); c.setBounds(0, 0, r.width, r.height); Component cc = c.getComponentAt(e.getX() - r.x, e.getY() - r.y); if (cc == null) return; cc.dispatchEvent(new MouseEvent(cc, e.getID(), e.getWhen(), e.getModifiersEx(), e.getX() - r.x - cc.getX(), e.getY() - r.y - cc.getY(), e.getClickCount(), e.isPopupTrigger(), e.getButton())); table.repaint(r); } }
private Object getElementAt(Point p) { int row = table.rowAtPoint(p); int col = table.columnAtPoint(p); if (row != -1 && col != -1) return table.getValueAt(table.rowAtPoint(p), table.columnAtPoint(p)); return null; }
public void mousePressed(MouseEvent e) { dispatchEvent(e); }
public void mouseReleased(MouseEvent e) { dispatchEvent(e); }
public void mouseEntered(MouseEvent e) { dispatchEvent(e); }
public void mouseExited(MouseEvent e) { dispatchEvent(e); }
public void mouseDragged(MouseEvent e) { dispatchEvent(e); }
public void mouseMoved(MouseEvent e) { dispatchEvent(e); }
private void dispatchWheel(MouseWheelEvent e) { Point p = e.getPoint(); Object o = getElementAt(e.getPoint()); if (o instanceof Component) { Component c = (Component)o; Rectangle r = table.getCellRect(table.rowAtPoint(p), table.columnAtPoint(p), false); c.setBounds(0, 0, r.width, r.height); Component cc = c.getComponentAt(e.getX() - r.x, e.getY() - r.y); if (cc == null) return; cc.dispatchEvent(new MouseWheelEvent(c, e.getID(), e.getWhen(), e.getModifiersEx(), e.getX() - r.x - cc.getX(), e.getY() - r.y - cc.getY(), e.getClickCount(), e.isPopupTrigger(), e.getScrollType(), e.getScrollAmount(), e.getWheelRotation())); table.repaint(r); } }
public void mouseWheelMoved(MouseWheelEvent e) { dispatchWheel(e); } }
class WidgetRenderer implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return (Component)value; } }
|
|