Изменение действия кнопки в подклассе - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь изменить действие кнопки в подклассе, потому что форма в значительной степени точно такая, за исключением того, что запрашивается идентификатор. Я попытался сделать ActionListener объект и создать его экземпляр объекта анонимного класса, например:

class ParentClass extends JPanel{
    JButton button;
    ActionListener buttonAction;

    ParentClass{
        button = new JButton("Parent Action");
        buttonAction = new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("The button was clicked by the parent class");
            }
        };
        button.add(buttonAction);
        add(button);
    }
}

    class ChildClass extends ParentClass{
        JButton button;
        ActionListener buttonAction;

        ChildClass{
            super();
            buttonAction = new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("The button was clicked by the child class");
                }
            };
        }
    }


public static void main(String[] args){
    JFrame frame = new JFrame;
    frame.add(new ChildClass());
    frame.setSize(600, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

Я пытался использовать этот метод, но actionPerformed для buttonAction никогда не вызывалось. Как я могу изменить действие кнопки для родительского класса и подкласса?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

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


    class ParentClass extends JPanel{
        JButton button;
        ActionListener buttonAction;

        ParentClass{
            button = new JButton("Parent Action");
            buttonAction = new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("The button was clicked by the parent class");
                }
            };
            button.add(buttonAction);
            add(button);
        }
    }

Так что в подклассе вы бы сделали следующее:


    class ChildClass extends ParentClass{
        JButton button;
        ActionListener buttonAction;

        ChildClass{
            super();
            buttonAction = new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("The button was clicked by the child class");
                }
            };
            button.removeActionListener(button.getActionListeners()[0]);
            button.addActionListener(buttonAction);
        }
    }

Я, однако, не знаю почему, но хотел бы получить объяснение, почему buttonAction пришлось перерегистрировать.

0 голосов
/ 10 ноября 2019

Вы можете позволить родительскому классу реализовать ActionListener, затем использовать button.addActionListener(this), чтобы добавить действие к кнопке. Затем в подклассе @Override actionPerformed метод:

class ParentClass extends JPanel implements ActionListener
{
   ParentClass()
   {
       JButton button = new JButton("something");
       button.addActionListener(this);
       add(button);
    }

    @Override
    public void actionPerformed(ActionEvent event)
    {
        System.out.println("I am the parent.");
    }
}

class SubClass extends ParentClass
{
    SubClass()
    {
       super();//initialize button
    }

     @Override
     public void actionPerformed(ActionEvent event)
     {
         System.out.println("I am the child.");
     }
}

Другой способ - добавить ActionListener, а внутри него вызывать только метод. Что-то вроде buttonPressed. Затем в подклассе @Override buttonPressed метод.

Полный пример:

public class Test extends JFrame {
    public Test() {
        super("test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLayout(new GridLayout(2, 1));
        add(new ParentPanel());
        add(new ChildPanel());
        pack();
        setLocationByPlatform(true);
    }

    private class ParentPanel extends JPanel implements ActionListener {
        public ParentPanel() {
            super(new BorderLayout());

            JButton button = new JButton("My Class:" + getClass());
            button.addActionListener(this);
            add(button);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Parent");

        }
    }

    private class ChildPanel extends ParentPanel {
        public ChildPanel() {
            super();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().setVisible(true));
    }
}
...