JViewport не будет генерировать область просмотра для производного класса JPanel - PullRequest
1 голос
/ 22 марта 2012

Я считаю, что JViewport работает с JPanel, но когда я создаю новый класс, расширяющий JPanel, создается впечатление, что JViewport игнорируется программой.Я не знаю, делаю ли я что-то не так, так что это тест, который я провожу и все равно получаю тот же результат:

public class panel extends JPanel
{
    public panel()
    {
        super();
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.drawString("Hello World", 50, 50);
        g.setColor(Color.RED);
        g.fillRect(50,50,100,100);
        g.setColor(Color.BLACK);
        g.fillOval(100, 100, 50, 50);
    }
}

public class test extends JFrame
{
    private panel p;
    public void init()
    {
        this.setSize(1000, 1000);
        this.setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);

        p = new panel();
        p.setOpaque(false);

        JViewport v = new JViewport();
        v.setViewSize(new Dimension(200,200));
        v.setViewPosition(new Point(2000,2000));
        v.setView(p);
        this.add(v,BorderLayout.CENTER);
    }
    public test()
    {
        init();
    }
    public static void main(String[] args)
    {
        test t = new test();
    }

}

Предполагается показать часть нарисованного JPanel, но окно JFrame просто отображаетвся JPanel.Поэтому я не знаю, сделал ли я что-то неправильно или JViewport не создан для этой цели.Если это последнее, то было бы замечательно, если бы кто-нибудь мог предложить обходное решение.

Спасибо

1 Ответ

2 голосов
/ 22 марта 2012

Используемое BorderLayout заставляет область просмотра, расположенную в центре, занимать все пространство внутри рамки, поскольку в этом макете нет других компонентов. Вот как работает BorderLayout.

Таким образом, область просмотра также имеет больший размер, чем определено (размер перезаписывается менеджером макета). Поскольку панель также не имеет фиксированного размера, она также будет изменена.

Чтобы изменить это, используйте другой менеджер макета или установите минимальный / максимальный размер для области просмотра и переопределите getPreferredSize() для панели.

В качестве примечания: не используйте имена классов в нижнем регистре, такие как panel.

...