Рисовать поверх компонентов в Swing? - PullRequest
7 голосов
/ 08 января 2012

У меня JPanel добавлено к JViewport, и к панели добавлено несколько других панелей.Я пытаюсь реализовать перетаскивание, где вы можете выбрать более одного компонента, перетаскивая мышь.Единственная проблема, с которой я сталкиваюсь, заключается в том, что прямоугольник выделения закрашивается за компонентами, добавленными к основному JPanel.Как я могу рисовать поверх них?

Моя структура выглядит следующим образом:
JFrame -> ContentPane -> JLayeredPane -> JScrollPane -> JPanel ->JPanel [].

Эскизный проект для задания колледжа:
Как видите, прямоугольник находится за другими панелями.

Design draft for college assignment.

Ответы [ 6 ]

12 голосов
/ 08 января 2012

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

Это один случай, когда выследует переопределить метод paint () панели, а не метод paintComponent ().После этого все пользовательские компоненты будут окрашены.

4 голосов
/ 08 января 2012

Использование многослойной панели:

http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

Это позволяет создавать перекрывающиеся компоненты.

Использование стеклянной панели для обработки перетаскивания и, возможно, событийа также:

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

1 голос
/ 08 января 2012

горячий действительно уверен, что вам действительно нужно и конечный эффект, может быть, есть два других способа рисования в

1) GlassPane

2) Viewport

Вы можете аккуратно сложить это вместе Insets с видимым Rectanle

1 голос
/ 08 января 2012

Не видя вашего реального кода, трудно сказать, что вы делаете неправильно. Тем не менее, я все еще могу сказать, что я буду делать:

Создайте JPanel, которая представляет всю область, где вы хотите рисовать, которая, конечно же, содержит каждый компонент.
Замените эту панель на paintComponents(Graphics) следующим образом (ИЗМЕНЕНО, обратите внимание, что s теперь является последним символом в имени метода):

@Override
public void paintComponents(Graphics g)
{ //                      ^
    super.paintComponents(g);

    // Draw your selection rectangle:
    g.setColor(Color.RED);
    g.drawRectangle(selectionRectangle); 
}
0 голосов
/ 28 декабря 2012

Пользовательское рисование поверх компонентов Swing облегчено JLayeredPane.T его статья описывает абстрактный базовый класс, который облегчает перекрашивание определенных областей (например, прямоугольников выделения или границ компонентов).

0 голосов
/ 08 января 2012

Хорошо, вот что я решил сделать в итоге:
Я не уверен, что это лучший способ сделать это, но, похоже, все в порядке.
Примечание. Использование MigLayout.

В конструкторе JPanel, лежащем под цветными блоками.

 ...
 this.add(new JPanel() {

     @Override
     public boolean isOpaque() {
        return false;
     }

     @Override
     public void paintComponent(Graphics g) {
        if (dragShape != null) {
           g.setColor(Colors.SECONDARY);
           g.setStroke(new BasicStroke(2));
           g.draw(dragShape);
        }
     }
  }, "pos 0 0, width 100%, height 100%", 0);
  ...
...