Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Передача параметров


Автор: Bulat 14.6.2006, 13:58
Вообщем-то, вот одна обрабока событий в котором я получаю некоторые данные(userId, recordId) и пытаюсь их передать в другую mi1.addMouseListener(new Item1Click(userId, recordId));, но они не передаются. Как еще их можно передать, или куда еще можно запихнуть обработку mi1.addMouseListener(new Item1Click(userId, recordId));, чтоб мои данные передовались?
Код

public class MouseClick implements MouseListener {
    private JTable t;
    private JPopupMenu pm;
    private JMenuItem mi1, mi2, mi3;
    private Object userId, recordId;

    public MouseClick(JTable t, JPopupMenu pm) {
        this.t = t;
        this.pm = pm;
        mi1 = new JMenuItem();
        mi2 = new JMenuItem();
        mi3 = new JMenuItem();
        mi1.setText("Просмотреть платежи");
        mi2.setText("Просмотреть статистику");
        mi3.setText("Просмотреть акты");
        pm.add(mi1);
        pm.add(mi3);
        pm.add(mi2);
        mi1.addMouseListener(new Item1Click(userId, recordId));
    }

    public void mouseClicked(MouseEvent evt) {
        if (evt.getButton() == evt.BUTTON3) {

            int column = t.columnAtPoint(new Point(evt.getX(), evt.getY()));
            int row = t.rowAtPoint(new Point(evt.getX(), evt.getY()));

            int selRows  = t.getSelectedRow();
            int selColumns = t.getSelectedColumn();

            if ( (selColumns == column) && (selRows == row)) {
                pm.show(t, evt.getX(), evt.getY() );
                userId = t.getValueAt(row, 0);
                recordId = t.getValueAt(row, 1);
            }
        }
    }

    public void mousePressed(MouseEvent evt) {

    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }
}
 

Автор: batigoal 14.6.2006, 14:14
А ты уверен, что они не передаются?  Может, передаются, но равны null? 

Автор: powerOn 14.6.2006, 14:16
Цитата(Bulat @  14.6.2006,  14:58 Найти цитируемый пост)
Код

mi1.addMouseListener(new Item1Click(userId, recordId));


интересно, а что за класс Item1Click ? И хотелось бы узнать зачем в Listener создавать JMenuItem. Это не очень красиво выглядит. 

Автор: Bulat 14.6.2006, 14:21
Цитата(Lamer George @ 14.6.2006,  14:14)
А ты уверен, что они не передаются?  Может, передаются, но равны null?

Ну естественно, передается null, но здесь я их получаю, а передается null, что соответственно = не передается.

Добавлено @ 14:27 
Цитата(MoonCat @ 14.6.2006,  14:16)
интересно, а что за класс Item1Click ? И хотелось бы узнать зачем в Listener создавать JMenuItem. Это не очень красиво выглядит.

Если тебе так интересно, но тут ничего интересного нет smile 
Код

public class Item1Click extends JFrame implements MouseListener {
    private Object userId;
    private Object recordId;

    public Item1Click(Object userId, Object recordId) {
        this.recordId = recordId;
        this.userId = userId;
    }

    public void mousePressed(MouseEvent evt) {
        if (evt.getButton() == evt.BUTTON1) {
            System.out.println(userId);
            System.out.println(recordId);
            ShowStatistic ss = new ShowStatistic(this, true, userId, recordId);
            ss.setLocationRelativeTo(this);
            ss.setVisible(true);
            if (ss.getExitState() == ss.EXIT_CANCEL) return;
        }
    }

    public void mouseClicked(MouseEvent evt) {

    }

    public void mouseExited(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseReleased(MouseEvent e) {

    }

}


Ну давай разберем, этот момент. Мне нужно динамически создающееся popupmenu, на каждый пункт(при нажатии) необходимо навешать обработку. Если ты мне предложишь более лучший и подходящий вариант с удовольствием его разберу smile 

Уж звыняйте, но на яве писал кое-что, но именно c GUI первый проект и сразу довольно серьезный. 

Автор: powerOn 14.6.2006, 14:43
Цитата

public class MouseClick implements MouseListener {
....
private Object userId, recordId;
    public MouseClick(JTable t, JPopupMenu pm) {
        this.t = t;
        this.pm = pm;
        mi1 = new JMenuItem();
        mi2 = new JMenuItem();
        mi3 = new JMenuItem();
        mi1.setText("Просмотреть платежи");
        mi2.setText("Просмотреть статистику");
        mi3.setText("Просмотреть акты");
        pm.add(mi1);
        pm.add(mi3);
        pm.add(mi2);
        mi1.addMouseListener(new Item1Click(userId, recordId));
    }


при таком раскладе, конструктору Item1Click в качестве параметром всегда будет передаваться null. Поскольку, public MouseClick(JTable t, JPopupMenu pm) - это конструктор и выполняется при создании объекта MouseClick, а поля userId, recordId в момент выполнения конструктора значений не имеют. 
P.S.: Хотя странно, мне всегда казалось, что компилятор ругается, если использовать не инициализированные ссылки на объекты...  smile 
 

Автор: Bulat 14.6.2006, 15:18
Цитата(MoonCat @ 14.6.2006,  14:43)
при таком раскладе ...

Я это уже понял. Смотри, допустим я перекину все пункты меню в основной форму, там набросаю обработку действий, а данные буду получать через getter'ы: в MouseClick пропишу getter'ы для моих переменных, а потом в Item1Click буду вызывать MouseClick и соответственно getter. Если так сделать?

Добавлено @ 15:29 
Попробовал, пока не получается 

Автор: powerOn 14.6.2006, 15:34
Цитата(Bulat @  14.6.2006,  16:18 Найти цитируемый пост)
Смотри, допустим я перекину все пункты меню в основной форму, там набросаю обработку действий, а данные буду получать через getter'ы: в MouseClick пропишу getter'ы для моих переменных, а потом в Item1Click буду вызывать MouseClick и соответственно getter. Если так сделать? 

 Тогда получается, что Item1Click должен иметь ссылку на  MouseClick, чтобы иметь возможность вызывать его getter методы. 
Мне бы хотелось услышать для реализации какой функциональности это все необходимо. Поскольку может быть динамическое меню, а может быть динамическая обработка (т.е не только обрабатываемые данные, но и алгоритм меняется) , и может решение гороздо проще чем кажется.  smile  

Автор: Bulat 14.6.2006, 15:52
Цитата(MoonCat @ 14.6.2006,  15:34)
Мне бы хотелось услышать для реализации какой функциональности это все необходимо. Поскольку может быть динамическое меню, а может быть динамическая обработка (т.е не только обрабатываемые данные, но и алгоритм меняется) , и может решение гороздо проще чем кажется.  smile

Моя фантазия smile .

В принципе надо: выбрал в таблице строку, нажал правой кнопкой мышки, выпало меню, нажал левой кнопкой мышки  на одном из пунктов, появился соответствующий JDialog. при этом там туда-сюда передавать некоторые данные. 

Есть у меня такой минус: я еще это не дописал, а у меня в голове крутятся мысли как еще улучшить свой проект smile . Вот я и начинаю по ходу дела менять, не создав в голове четкую картину по update. 

Автор: powerOn 14.6.2006, 16:19
Цитата(Bulat @  14.6.2006,  16:52 Найти цитируемый пост)
В принципе надо: выбрал в таблице строку, нажал правой кнопкой мышки, выпало меню, нажал левой кнопкой мышки  на одном из пунктов, появился соответствующий JDialog. при этом там туда-сюда передавать некоторые данные. 


Т.е. меню постоянное. В обработчике нажатия на пункт контекстного меню, нужно собрать все необходимые для дальнейшей обработки данные. Например кординаты выбранной ячейки в таблице, или её значение, ссылки на другие элементы. Потом эти данные используются для создания нового потока обработчика. Этот поток и будет инициализировать и показывать твой диалог,  а также производить всю необходимую длительную обработку. Типичное делегирование.
Т.е. Выбрали ячейку -> щелк. правой кнопкой мыши -> отобразили меню -> выбрали пункт меню, Обработка выбора пункта меню собирает всю необходимую инфу, создает новый поток-обработчик и запускает его. Поток обработчик  в свою очередь уже занимется отображением необходимых диалогов и других действий...

Все компоненты и всех слушателей можно создать один раз, различие в работе будет обусловленно только передаваемыми данными. Что будет создаваться каждый раз заново, так это поток-обработчик. Ну, а ему по должности велено.  smile 

   

Автор: Bulat 14.6.2006, 16:35
Все, все, все доперло! smile Нафиг ниче передовать не надо, можно сделать проще! Пасиба, одна строка из последнего твоего поста меня навела на мысль, как проще сделать, не передовая ничего. Отдуши! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)