Можете ли вы поместить прослушиватель действий в прослушиватель действий?

#java #swing #jpanel #jbutton #actionlistener

#java #swing #jpanel #jbutton #actionlistener

Вопрос:

Когда я нажимаю кнопку с надписью «один», мое всплывающее окно зависает, и я думаю, это потому, что я пытаюсь поместить кнопку с прослушивателем действий в прослушиватель действий другой кнопки. Возможно ли это?

 //code...

    one = new JButton("Customize Race");
    one.setBounds(30,200,200,75);
    one.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed( ActionEvent e ) {
            one.setVisible(false);
            
            Boolean pic = true;
            
            String Player1 = "Player1";
           
            while (pic == true)
            {
                p1 = new JButton(Player1);
                p1.setBounds(50, 50, 200, 100); 
                p1.addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        // code that will pull up menu to 
                           customize string value of Player1 
                    }
                });
                
                
                next1 = new JButton("Next =>");
                next1.setBounds(50, 375, 450, 50); 
                next1.addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        Boolean pic = false;
                    }
                });
                
                
                panel.add(p1);
                panel.add(next1);
                
            }              
                p1.setVisible(false);
        }
    });
    panel.add(one);

    frame.setVisible(true);
 

Ответ №1:

Можете ли вы поместить прослушиватель действий в прослушиватель действий?

Да, вы можете создать компонент в своем ActionListener и добавить ActionListener к новому компоненту.

Проблема не в этом.

мое всплывающее окно зависает,

 while (pic == true)
 

Проблема в том, что у вас есть цикл while, который продолжает выполняться.

Ваш ActionListener постоянно создает компоненты и добавляет их во фрейм, и цикл никогда не заканчивается.

Избавьтесь от цикла while!!!

Кроме того, когда вы добавляете компоненты в видимый фрейм, код должен быть:

 panel.add(....);
panel.revalidate();
panel.repaint();
 

Revalidate() вызывает диспетчер компоновки, чтобы компонент можно было правильно расположить, а repaint() просто проверяет, что все компоненты перерисованы.