Вызов перерисовки внутреннего класса не вызывает paint(), на самом деле ничего не делает

Я не очень хорошо знаком с JApplet, а также с рисованием и перекрашиванием(). Любая помощь приветствуется.

У меня есть внешний класс «A», который расширяет JApplet и рисует что-то в его paint(). У меня также есть частный класс «B», который находится внутри A, а также расширяет JApplet и рисует что-то в его paint(). Paint() A вызывает paint() B, поэтому при запуске A рисуются как A, так и B.

Я использую mouselistener, чтобы определить, когда щелкнули мышью, и именно тогда B должен перерисовать() и нарисовать что-то новое и удалить старое.

Однако, когда я нажимаю кнопку мыши, я вижу, что repaint() в B ничего не делает. Я вывожу на консоль пару отладочных сообщений и могу сказать, что при вызове функции B repaint() ничего не происходит, т. е. программа должна снова пройти через функцию paint() B, но этого не происходит.

Вот общая структура, и снова приветствуется любая помощь.

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;

    public class A extends JApplet {

        private class B extends JApplet implements  MouseListener{

            public B() { }
            public void paint (Graphics g) {
                // g.drawline ...
                //System.out...
            }

            public void mousePressed(MouseEvent e) {
                //System.out....
                repaint();
            }
            public void mouseReleased(MouseEvent e) {
                //System.out....
                repaint();

            }
            // ... rest of mouse listener interface

        }

        public void init() {
            // setSize() ...
        }


        public  void paint(Graphics g) {
            // g.drawRectange ...
            // Draw other stuff

            B b = new B();
            B.paint(g)
        }
    }

person Community    schedule 18.11.2018    source источник
comment
Удалите private class B extends JApplet implements MouseListener{ public B() { } (но добавьте implements MouseListener во внешний апплет), и он должен работать как положено (AFAIU). Что приводит к вопросу... Почему вы пытаетесь это сделать?   -  person Andrew Thompson    schedule 18.11.2018
comment
Измените свой вопрос, включив в него MCVE, который может быть скомпилирован и протестирован другими, который показывает, что ваши вызовы отладки System.out.println() печатаются, но контент не перезагружается. Также включите код, который показывает/загружает ваш апплет.   -  person Progman    schedule 18.11.2018
comment
@Progman включите MCVE Отличная идея и совет: [mcve] в комментарии автоматически расширяется до минимального воспроизводимый пример.   -  person Andrew Thompson    schedule 19.11.2018
comment
@AndrewThompson Не знал, спасибо;)   -  person Progman    schedule 19.11.2018


Ответы (1)


Проблема в том, что на запрос repaint() в вашем классе B ничего не реагирует. Это может вызвать перерисовку класса B, но это не означает, что класс A перерисовывается, ему никто не сказал. Как вы сказали:

Paint() A вызывает paint() B, поэтому при запуске A рисуются как A, так и B.

Это верно, но это не значит, что наоборот.

Если вы хотите, чтобы класс A перерисовал свое содержимое, вы должны вызвать repaint() для объекта A, так как это класс, который вы хотите перерисовать.

person Progman    schedule 18.11.2018
comment
Привет, большое спасибо, но это не то, о чем я просил. Я говорю, что перерисовка Б должна вызвать перерисовку Б, но это не так. Я вовсе не пытаюсь перекрасить А. - person ; 18.11.2018
comment
@seansontag Как вы отображаете JApplet B? - person Progman; 18.11.2018
comment
Я думаю, я должен уточнить, чтобы отобразить JApplet, A paint() вызывается один раз, но это все. После этого B должен продолжать перекрашивать себя. - person ; 18.11.2018
comment
@seansontag Проблема в том, что вы показываете апплет A, а не B. Возможно, вы ищете обычную панель JPanel, добавленную в менеджер компоновки вашего JApplet A. Пожалуйста, отредактируйте свой вопрос с помощью MCVE. - person Progman; 18.11.2018