Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 108
1

Как задать порядок отрисовки компонентов

28.06.2018, 15:33. Показов 2874. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Есть JPanel на которой расположена кнопка и другая дочерняя панель закрашенная красным цветом. Дочерняя панель должна отрисовываться после отрисовки кнопки и закрывать её. Но по каким-то причинам кнопка всегда отрисовывается поверх дочерней панели. Я пробовал повлиять на порядок отрисовки добавляя кнопку и дочернюю панель на панель-контейнер в разной последовательности, а также пробовал использовать метод
Java
1
public Component add(Component comp, int index)
Вопрос: можно ли в swing каким-нибудь образом управлять порядком отрисовки компонентов, например сделать так, чтобы порядок отрисовки соответствовал порядку добавления компонентов.

Вот код простого примера, где я пытался разместить дочернюю панель над кнопкой:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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);*/
    }
 
}
}
Пожалуйста, помогите разобраться.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2018, 15:33
Ответы с готовыми решениями:

Как задать порядок элементов на форме?
Добавил несколько элементов на форму , получился "бутерброд"(возникли перекрытия в элементах)....

Изменение отрисовки компонентов
Подскажите пожалуйста как можно изменять форму и цвет как самой формы так и компонентов. Причем...

AddSubview порядок отрисовки
допустим у меня есть UIView в виде зеленого квадрата, еще один в виде красного прямоугольника и...

Порядок отрисовки треугольников
Здравствуйте! Начал изучать opengl и у меня возникли проблемы с порядком отрисовки треугольников...

6
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17585 / 10335 / 2823
Регистрация: 21.10.2017
Сообщений: 22,408
28.06.2018, 18:11 2
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package ru.ismoke;
 
import javax.swing.*;
import java.awt.*;
 
public class Cyber {
 
    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(100, 100, 100, 40);
 
            childPanel = new JPanel();
            childPanel.setBounds(50, 50, 300, 300);
            childPanel.setBackground(Color.RED);
 
            add(button);
            add(childPanel, 0);
 
        }
    }
}
Миниатюры
Как задать порядок отрисовки компонентов  
1
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 108
28.06.2018, 19:39  [ТС] 3
Спасибо, iSmokeJC. Но кнопка как раз и не должна быть видна, её должна закрывать красная панель.
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17585 / 10335 / 2823
Регистрация: 21.10.2017
Сообщений: 22,408
28.06.2018, 19:40 4
setVisible
1
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 108
29.06.2018, 08:33  [ТС] 5
А если необходимо, чтобы панель закрывала кнопку частично? Ведь setVisible полностью её скроет.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
29.06.2018, 09:04 6
Лучший ответ Сообщение было отмечено Bakuard как решение

Решение

https://stackoverflow.com/ques... components
1
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 108
29.06.2018, 12:01  [ТС] 7
Спасибо xoraxax. Я посмотрел варианты предлагаемые в ответах к вопросу на который вы дали ссылку.
Вариант с JLayeredPane не подошел т.к. идея моего примера было создание наследников JPanel, каждй из которых представляет собой панель с множеством кнопок, выпадающих меню, картинками и т.д. Таких панелей несколько. Они могут добавляться в главное окно в произвольном порядке и перекрывать друг-друга со всем содержимым. А распределять отдельно каждую кнопку каждой панели в свой слой JLayeredPane по моему очень неудобно.
Вариант с применением метода setComponentZOrder просто не работает.
Вариант с применением OverlayLayout не работает как надо. Если панель после добавления и закрывает кнопку, то проведя курсор мыши по панели в том месте где она закрывает кнопку, приводит к тому, что кнопка отрисовывается над панелью.

Проблему удалось решить следующим образом:
в классе наследнике JPanel переопределяем метод isOptimizedDrawingEnabled так, чтобы он всегда возвращал false. Тогда можно применять setComponentZOrder или add(Component comp, int index) и они будут работать как надо.
0
29.06.2018, 12:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2018, 12:01
Помогаю со студенческими работами здесь

Как установить порядок отображения компонентов на форме?
Подскажите, пожалуйста, как программно установить порядок отображения компонентов на форме при их...

Как задать порядок материала
Джум. 3, порядок материала меняется либо стрелочками, либо перетаскиванием мышкой, но если статей в...

Как задать шрифт по умолчанию для всех компонентов
В общем загрузив шрифт мне нужно задать его по умолчанию. И как узнать какой шрифт по умолчанию...

Порядок контролов на форме/фрейме (как его задать)
Доброго всем дня. Есть форма, на ней несколько фреймов с наборами контролов (чек боксов). Нужно...

Как задать порядок сортировки в ленточной форме, используя код программы???
Как задать порядок сортировки в ленточной форме, используя код программы. Необходимо менять...

Порядок создания компонентов
Есть вертикальный LinearLayout в нем 2 фрагмента(первый выше, второй - ниже) эту разметку я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru