Как получить имя конкретного Jlabel, созданного динамически из значений в наборе результатов.Используете пункт меню JPop? - PullRequest
0 голосов
/ 26 марта 2019

Я создаю меню ресторана, я использую значения из resultSet для динамического создания JLabel для каждой записи. Теперь я хочу получить идентификатор конкретного Jlabel, используя JPopupMenu, пункт меню. Я добавил ActionListener в пункт меню, но он возвращает идентификаторы всех Jlabel вместо этого конкретного Jlabel. Может кто-нибудь, пожалуйста, помогите мне. Я приложил код ниже.

private void fillPanel() {

Integer id;

MenuDAOImpl menuDAOImpl = new MenuDAOImpl();

resultSet = menuDAOImpl.getAllMenuItems();


    try {
            while(resultSet.next()){

        ImageIcon img = new ImageIcon(resultSet.getString("item_img"));
                 JLabel label = new JLabel(img);
                 label.setText(resultSet.getString("item_name"));
                 label.setFont(new Font("Verdana", Font.BOLD, 11));
                 label.setHorizontalTextPosition(SwingConstants.CENTER);
                 label.setVerticalTextPosition(SwingConstants.BOTTOM);
                 id = resultSet.getInt("item_id");
                 label.setName(id.toString());
                 label.addMouseListener(new MouseListener() {

        public void mouseClicked(MouseEvent e) {
            System.out.println(label.getName());
          }

        @Override
        public void mousePressed(MouseEvent me) {}
        @Override
        public void mouseEntered(MouseEvent me) {}
        @Override
        public void mouseExited(MouseEvent me) {}
        @Override
        public void mouseReleased(MouseEvent evt) {
        if (evt.isPopupTrigger()){          
            JLabel source = (JLabel)evt.getSource();
            menuItemPopup.show(evt.getComponent(), evt.getX(), evt.getY());
               } 

             }

            }); 

          // This is the menu item in JpopupMenu
 // This method below is returning Id of every Jlabel created.
            updateMenuItem.addActionListener(new ActionListener(){ 
                 public void actionPerformed(ActionEvent e){
                     System.out.println(label.getName());
                 }


             });
            menuItem.add(label);
            }  

        } catch (SQLException ex) {
            Logger.getLogger(MenuFrame.class.getName()).log(Level.SEVERE, null, ex);
        }


        menuItem.revalidate();
        menuItem.repaint();
    }
}

1 Ответ

0 голосов
/ 26 марта 2019

Если вы динамически создаете объекты, то вам нужно создать универсальных слушателей. Эти слушатели должны быть созданы вне цикла и доступны всем созданным вами компонентам.

Кроме того, JPopuMenu предназначен для использования с JMenuItmes. Значки поддержки JMenuItem и добавление ActionListener в элемент меню для обработки щелчка мыши по элементу.

Так что обычный слушатель будет выглядеть примерно так:

ActionListener al = new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JMenuItem menuItem = (JMenuItem)e.getSource();
        System.out.println( menuItem.getName() );
    }
}

Вы создаете слушателя до того, как начнете код зацикливания.

Затем в вашем цикличном коде вы делаете что-то вроде:

while(resultSet.next())
{
    JMenuItem menuItem = new JMenuItem(...);
    ...
    Integer id = resultSet.getInt("item_id");
    menuItem.setName(id.toString());
    menuItem.addActionListener( al );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...