Объекты Java Swing Draw над другими компонентами

Я пытаюсь сделать небольшую программу для рисования. Я рисую объекты поверх JPanel, который находится поверх JFrame (я использую Netbeans 6.9). У меня есть некоторые базовые функции, такие как шрифт, линия и fillRectangle. Я использую стандартный метод рисования, который заключается в переопределении paintComponent().

class .... extends JPanel
{
@Override
void paintComponents(Graphics g)
{
.......
}
}

Проблема в том, что когда я рисую текст, линию над регионом, он рисуется за ним, а не поверх него. В основном я хочу рисовать объекты поверх всех других объектов, которые ранее были нарисованы на JPanel. Я действительно не хочу переключаться на другие типы многослойных панелей. Один из очень наивных методов будет состоять в том, чтобы отменить каждый объект и нарисовать их в обратном порядке (последний сначала).


person Dipendra Kumar Mishra    schedule 05.11.2012    source источник
comment
Спасибо Дэвид за вашу помощь. Я вызвал paintComponent, однако чертова штука не будет закрашивать своего родного брата. Я предполагаю, что стекло звучит как решение, но потребует слишком много накладных расходов. Посмотрим, найду ли я другой способ. Кстати, я оценил ваши решения. Спасибо.   -  person Dipendra Kumar Mishra    schedule 08.11.2012


Ответы (1)


Вам нужно будет переопределить paintComponent(Graphics g) и не забудьте позвонить super.paintComponent(Graphics g);

class .... extends JPanel
{
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);//honor paintComponent an call super to draw other components that were added to the JPanel
        .......
    }
}

Вам также может понадобиться переопределить getPreferredSize(..) из JPanel и вернуть соответствующий размер, чтобы JPanel было видно:

class .... extends JPanel
{
    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(300,300);
    }
}

РЕДАКТИРОВАТЬ:

В зависимости от того, что вы делаете, вы также можете взглянуть на GlassPane, который позволит вам установить прозрачную панель по всему окну JFrame, а также может быть окрашен, что приведет к тому, что графика будет отображаться поверх всех остальных, например:

введите здесь описание изображения

person David Kroukamp    schedule 05.11.2012