Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 金元';t为JPanel生成视口';s派生类_Java_Swing_Jpanel_Viewport_Paintcomponent - Fatal编程技术网

Java 金元';t为JPanel生成视口';s派生类

Java 金元';t为JPanel生成视口';s派生类,java,swing,jpanel,viewport,paintcomponent,Java,Swing,Jpanel,Viewport,Paintcomponent,我相信JViewport确实可以与JPanel一起工作,但是当我构建一个扩展JPanel的新类时,程序似乎忽略了JViewport。我不知道我是否做错了什么,所以这是我进行的测试,仍然得到相同的结果: public class panel extends JPanel { public panel() { super(); } public void paintComponent(Graphics g) { super.pa

我相信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不是为此目的而构建的。如果是后者,那么如果有人能提出解决方案,那就太好了


谢谢

您使用的
边框布局
会导致位于中间的视口占据框架内的整个空间,因为该布局中没有其他组件。这就是
BorderLayout
的工作原理

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

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


请注意:不要使用小写类名,如
panel

+!,似乎当您重写
paintComponent(…)
时总是更喜欢重写
getPreferredSize()
太:-)