Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WidgetTable, Результаты работы, увы нужна помощь! 
:(
    Опции темы
Platon
Дата 16.2.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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;
    }
}

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.