JViewport不会为JPanel的派生类生成视口

时间:2012-03-22 16:10:48

标签: java swing jpanel viewport paintcomponent

我相信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 个答案:

答案 0 :(得分:2)

您正在使用的BorderLayout会导致放置在中心的视口占据框架内的整个空间,因为该布局中没有其他组件。这就是BorderLayout的工作方式。

因此视口的大小也大于定义的大小(布局管理器会覆盖大小)。由于面板也没有固定大小,因此也会调整大小。

要更改它,请使用其他布局管理器或为视口设置最小/最大尺寸,并覆盖面板的getPreferredSize()

作为旁注:请勿使用panel等小写类名。