Есть 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);*/
}
}
}
Проблему удалось решить следующим образом: в классе наследнике 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;
}
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости