объект, куда я добавляю элементы.

хо знаю Swing, так что извините за глупый вопрос. Что мне нужно сделать, это сделать мои собственные компоненты (они являются предкамиJPanel) с покраской, выполненной из буфера (BufferedImage экземпляр). Это является обязательным требованием, поскольку процедура рисования может быть очень тяжелой, поэтому метод paintComponent переопределяется для рисования из этого буфера и немедленного возврата (но если вы знаете более эффективные способы сказать Java, что не следует перерисовывать объект более 200-300 раз в секунду, потребляя весь процессор - я был бы признателен, может быть, есть некоторые публичные методы, чтобы пометить области контекста Graphics как «не измененные», поэтому Swing не пытается их перерисовать).

Что не так с моим кодом, что он просто не рисует данные о перекрывающихся JPanels. Я сделал воспроизводимый пример суть проблемы. Смотрите код ниже:

public class Dr extends JPanel {

    public Dr(int x, int y, int w, int h, int fw, int fh) {
        left = x;
        top = y;
        width = w;
        height = h;
        full_width = fw;
        full_height = fh;
        setOpaque(true);
    }

    public void draw() {
        if (buffer == null && width > 0 && height > 0) {
            buffer = new BufferedImage(width, height, java.awt.image.BufferedImage.TYPE_INT_ARGB);
        }
        if (buffer == null) return;
        Graphics g = buffer.getGraphics();
        setBounds(0, 0, full_width, full_height);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setBackground(Color.WHITE);
        g2d.clearRect(0, 0, full_width, full_height);

        g2d.setColor(new Color(255, 0, 80, 128));

        g2d.fillRect(left, top, width, height);
        System.out.println(left + ", " +  top);
    }

    @Override
    public void repaint() {
        draw();
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(buffer, 0, 0, null);
    }

    private BufferedImage buffer;

    private int left;
    private int top;
    private int width;
    private int height;
    private int full_width;
    private int full_height;
}

Это пример класса, который делает только сохранение своих координат для рисования и полных измерений (которые я хочу, чтобы они были равны его родительским измерениям, это опять требование, потому что мне нужно поддерживать видимый переполненный контент, чтобы его можно было отображать) и рисуя красный прямоугольник с половиной 100% непрозрачности.

Вот внешний код, который его использует:

    Dr dr1 = new Dr(4, 4, width-10, 80, width-2, height-2);
    Dr dr2 = new Dr(4, 88, width-10, 80, width-2, height-2);
    root.add(dr1);
    root.add(dr2);
    dr1.setBounds(0, 0, width-2, height-2);
    dr2.setBounds(0, 0, width-2, height-2);
    dr1.draw();
    dr2.draw();

Что ожидается быть:

Что отображается, когда я удаляю свой буфер и рисуюpaintComponent метод напрямую:

Что отображается, когда я не заполняю фон (здесь фон имеет системный цвет L & F, но мне нужен цвет родительского элемента (в моем примере это белый)

Что отображается, когда я рисую из буфера

Последнее совершенно забавно. Красный прямоугольник частично обрезается справа и снизу, а полное изображение (включая белый фон) обрезается по координате (0, 0) родительской панели. Второй объект вообще не отображается. Координаты в консоли абсолютно нормальные.

Я чувствую, что есть что-то, что я должен сделать с Swing, чтобы сказать ему не выполнять свою «магию» при угадывании, что рисовать, а что не рисовать. Но как я могу это сделать?

ОБНОВИТЬ:

Я обнаружил, что даже если я не позвонюdraw() Метод моих дочерних компонентов, после того как я их добавил, они все еще скрывают фон своего родителя (что не должно происходить, поскольку JPanels для базы должны быть непрозрачными). Так что основная проблема в том, что я не могу сделатьDr объекты имеют непрозрачный фон (например, без фона), где в них ничего не нарисовано (это также объясняет, почему я вижу только первый прямоугольник - z-порядок в Swing кажется перевернутым, например, последний добавленный компонент закрашивается снизу, как это был самый дальний от нас).

Ответы на вопрос(2)

Ваш ответ на вопрос