java - JViewport 不会为 JPanel 的派生类生成视口(viewport)

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

谢谢

最佳答案

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

因此,视口(viewport)也被赋予了比定义更大的尺寸(该尺寸被布局管理器覆盖)。由于面板也没有固定的大小,因此它也会调整大小。

为了改变这一点,可以使用不同的布局管理器,或者设置视口(viewport)的最小/最大尺寸并覆盖面板的 getPreferredSize()

附注:不要使用小写的类名,例如 panel

关于java - JViewport 不会为 JPanel 的派生类生成视口(viewport),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826224/

相关文章:

java - GridLayout 面板上的面板

java - 如何从 Java 访问 Clarion Tables

java - 使用对象模型作为参数启动 java 程序

java - 如何将带有 GroupLayout 的面板添加到 JFrame?

Java swing 异常处理程序

java - JPanel 不更新,无论我尝试什么

java - 在元素 xml 之间保留文字字符串

java - 在jpa中生成报告

java - Oracle Java 树教程 : Where and how to implement the tutorial code

java - JPanel 在 For 循环完成之前不会更新或重新绘制