Jpanel в JScrollPane, рисование поверх полос прокрутки

у меня проблема как на картинке

Рисование наложенных полос прокрутки

Моя процедура добавления выглядит следующим образом:

JFrame -> Панель просмотра -> JTabbedPane -> JPanel (Мой холст)

Я рисую свои рисунки внутри paintComponent и в самом конце вызываю revalidate(). Помощь будет высоко оценена!

Редактировать:

код компонента краски

public void paintComponent(Graphics g) {
    super.paintComponent(g);        
    Graphics2D g2d = (Graphics2D) g;

    //Obtain document size
    double width = model.getWidth();
            double height = model.getHeight();

    canvasBounds = new Rectangle2D.Double(0, 0, width, height);
    g2d.setColor(Color.WHITE);
    g2d.fill(canvasBounds);

    Dimension size = new Dimension();
    size.setSize(canvasBounds.getWidth() * zoomFactor, canvasBounds.getHeight() * zoomFactor);
    this.setPreferredSize(size);

    g2d.setClip(canvasBounds);
    List<DrawableShape> svgShapes = model.getDrawableShapes();
    for(DrawableShape shape : shapeList) {
        shape.draw(g2d);            
    }           
    revalidate();
}

person Ben C.    schedule 16.05.2012    source источник
comment
Не могли бы вы показать свой код для paintComponent()   -  person wattostudios    schedule 16.05.2012
comment
То, чего вы пытаетесь достичь, наводит меня на мысль об этом руководстве по Oracle: docs.oracle.com/javase/tutorial/uiswing/components/ . Может быть, это может помочь вам.   -  person alain.janinm    schedule 16.05.2012
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE. (Примечание: SSCCE!='ваш код'.)   -  person Andrew Thompson    schedule 17.05.2012


Ответы (3)


Похоже, что-то не соответствует границам вашего clip. Может быть, это меняется в методе shape.draw()?

Почему бы вам не попробовать создать новый объект Graphics для передачи в shape.draw() вместо вашего setClip(). Что-то вроде этого...

Graphics2D newG = (Graphics2D)g.create(0, 0, width, height);

А затем измените свой код на этот...

shape.draw(newG);
person wattostudios    schedule 16.05.2012

Я думаю, вы должны попытаться получить свои кадры JRootPane object , выполнить итерацию до уровня компонентов и восстановить границы компонентов с помощью getBounds() , а затем добавить эти прямоугольники в обтравочную маску. Таким образом, ваша краска будет выглядеть позади ваших компонентов, а не над ними.

Недавно я столкнулся с той же проблемой. Я решил так:

    Rectangle mask = null;


for( Component c : getComponents() )

{

    if( c instanceof JRootPane )

    {

        JRootPane rootPane = (JRootPane) c;

        rootPane.setDoubleBuffered(true);

        for( Component cRootPane : rootPane.getComponents())

        {

             if( cRootPane instanceof JLayeredPane)

             {

                JLayeredPane cLayerPanels = (JLayeredPane) cRootPane;

                cLayerPanels.setDoubleBuffered(true);

                for( Component cLayerPanel : cLayerPanels.getComponents() )

                {

                    if( cLayerPanel instanceof JPanel)

                    {

                        JPanel cPanels = (JPanel) cLayerPanel;

                        cPanels.setDoubleBuffered(true);



                        for( Component cPanel : cPanels.getComponents() )

                        {

                            if( cPanel instanceof JPanel)

                            {

                                JPanel cPanels2 = (JPanel) cPanel;

                                cPanels2.setDoubleBuffered(true);

                                 mask = getBounds();

                                for( Component cPanel2 : cPanels2.getComponents() )

                                {

                                    mask.union(cPanel2.getBounds());

                                    cPanel2.paint(cPanel2.getGraphics());

                                }

                            }

                        }

                    }

                }

            }

        }

    }

}

getGraphics().setClip(mask);
person Leandro Pezzente    schedule 16.05.2012

Моя проблема была решена. Мне пришлось сравнить отсечение на моем canvasBounds с g2d.getClipBounds(). Поскольку мой клип canvasBounds был намного больше, чем то, что было дано g2d, он рисовал на полосе прокрутки.

Спасибо за вашу помощь!

person Ben C.    schedule 17.05.2012