Порядок отрисовки компонентов

203
09 августа 2018, 03:30

Есть JPanel на которой расположена кнопка и другая дочерняя панель закрашенная красным цветом. Дочерняя панель должна отрисовываться после отрисовки кнопки и закрывать её. Но по каким-то причинам кнопка всегда отрисовывается поверх дочерней панели. Я пробовал это исправить несколькими способами - они указаны в исходном коде который я привожу ниже:

public class Main {
    public static void main(String[] args) {
        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(new MyPanel());
        window.pack();
        window.setResizable(false);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
    }
    private static class MyPanel extends JPanel {
        private JButton button;
        private JPanel childPanel;
        private MyPanel() {
            setLayout(null);
            setPreferredSize(new Dimension(500, 500));
            button = new JButton("button");
            button.setBounds(100, 100, 100, 40);
            childPanel = new JPanel();
            childPanel.setBounds(50, 50, 300, 300);
            childPanel.setBackground(Color.RED);
            /*не работает
            add(button);
            add(childPanel, 0);*/
            /*Пробуем добавить сперва childPanel, а потом button.
              Не работает.
            add(childPanel);
            add(button);*/
            /*Пробуем добавить сперва button, а потом childPanel.
              Не работает.
            add(button);
            add(childPanel);*/
        }
    }
}
Answer 1

Проблему удалось решить следующим образом: в классе наследнике JPanel переопределяем метод isOptimizedDrawingEnabled так, чтобы он всегда возвращал false. Тогда можно применять setComponentZOrder или add(Component comp, int index) и они будут работать как надо.

import javax.swing.*;

import java.awt.*;

public class Main {

public static void main(String[] args) {
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    window.pack();
    window.setResizable(false);
    window.setLocationRelativeTo(null);
    window.setBounds(100, 100, 500, 500);
    window.add(new MyPanel());
    window.setVisible(true);
}
private static class MyPanel extends JPanel {
    private JButton button;
    private JPanel childPanel;

    MyPanel() {
        setLayout(null);
        setPreferredSize(new Dimension(500, 500));
        button = new JButton("button");
        button.setBounds(10, 100, 100, 40);
        childPanel = new JPanel();
        childPanel.setBounds(50, 50, 300, 300);
        childPanel.setBackground(Color.RED);
        add(button);
        add(childPanel, 0);
    }
    @Override
    public boolean isOptimizedDrawingEnabled() {
        return false;
    }
}

}

READ ALSO
Передача данных List на jsp страницу

Передача данных List на jsp страницу

Проблема в том что данные по какой-то причине не отображаются и таблица с помощью цикла не заполняетсяЯ предполагаю что данные почему-то...

191
Проблема с RecyclerView в PagerAdapter

Проблема с RecyclerView в PagerAdapter

В общем у меня есть фрагмент с ViewPager и TabLayoutна страничках есть фрагменты с текстом и фрагменты с RecyclerView

199
НЕ могу скомпилировать

НЕ могу скомпилировать

Ошибка при компиляции Error:(4, 26) java: package javafxapplication does not exist JDK установливал отсюда http://www

170
Ошибка в netbeans

Ошибка в netbeans

есть maven-проект(не мой)Пытаюсь запустить, пишет:

167