Как нарисовать JPanel в фиксированной позиции? - PullRequest
1 голос
/ 17 мая 2010

Я обернул JPanel в JScrollPane, и я хочу, чтобы прямоугольник рисовался всегда в одной и той же позиции = перемещение с полосами прокрутки не повлияет на видимость прямоугольника.

Я попробовал следующий код:

    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.drawRect(50, (int)getVisibleRect().getY(), 20 , 20);
    }

но перекрашивает прямоугольник только при изменении размера всей JPanel.

Ответы [ 3 ]

2 голосов
/ 17 мая 2010

Может быть, что-то вроде этого:

import java.awt.*;
import javax.swing.*;

public class ScrollPanePaint extends JFrame
{
    public ScrollPanePaint()
    {
        JPanel panel = new JPanel();
        panel.setOpaque( false );
        panel.setPreferredSize( new Dimension(400, 400) );

        JViewport viewport = new JViewport()
        {
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.setColor( Color.BLUE );
                g.drawArc( 100, 100, 80, 80, 0, 360);
            }
        };

        viewport.setView( panel );
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewport( viewport );
        scrollPane.setPreferredSize( new Dimension(300, 300) );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        JFrame frame = new ScrollPanePaint();
        frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
     }
}
1 голос
/ 17 мая 2010

IIRC, JScrollPane постарается свести к минимуму объем перерисовки, выполненной прокруткой, поэтому не всегда будет происходить обновление вашего компонента.

Стандартным методом является использование JLayeredPane. Добавьте вас JScrollPane на нижний слой, а над ним - непрозрачный стеклянный компонент. См. Как использовать многослойную панель в руководстве по Swing.

0 голосов
/ 17 мая 2010

Попробуйте setLocation метод. Посетите http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#setLocation%28int,%20int%29 для получения дополнительной информации.

...