С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java GUI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Bakuard
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 78
1

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

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

Доброго времени суток.

Есть 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2018, 15:33
Ответы с готовыми решениями:

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

Переопределение отрисовки компоненты JButton
Имеем наследника: CButton extends JButton c переопределенным методом отрисовки...

Как изменить порядок прохождения ячеек в JTable?
Привет всем. Подскажите, пож., как изменить порядок прохождения ячеек в...

Как можно реализовать такое расположение компонентов?
Вот на данном скрине видно, что сообщения располагаются следующим образом:...

Как получить текст из одного из компонентов на JPanel?
Здравствуйте. Есть JPanel. Из нее можно получить один из компонентов,...

6
iSmokeJC
Модератор
Эксперт Java
1054 / 869 / 410
Регистрация: 21.10.2017
Сообщений: 2,908
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
Миниатюры
Как задать порядок отрисовки компонентов  
Bakuard
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 78
28.06.2018, 19:39  [ТС] 3
Спасибо, iSmokeJC. Но кнопка как раз и не должна быть видна, её должна закрывать красная панель.
0
iSmokeJC
Модератор
Эксперт Java
1054 / 869 / 410
Регистрация: 21.10.2017
Сообщений: 2,908
28.06.2018, 19:40 4
setVisible
1
Bakuard
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 78
29.06.2018, 08:33  [ТС] 5
А если необходимо, чтобы панель закрывала кнопку частично? Ведь setVisible полностью её скроет.
0
xoraxax
1428 / 1352 / 402
Регистрация: 05.07.2013
Сообщений: 6,556
Завершенные тесты: 2
29.06.2018, 09:04 6
Лучший ответ Сообщение было отмечено Bakuard как решение

Решение

https://stackoverflow.com/questions/...ing-components
1
Bakuard
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 78
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2018, 12:01

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru