代码之家  ›  专栏  ›  技术社区  ›  zcourts

JPanel不会调整大小

  •  1
  • zcourts  · 技术社区  · 14 年前

    My Code:

    public MyConstructor() {
        view = new JPanel(new GridLayout(3, 1));
        header = new JPanel(new GridLayout(2, 1));//2 ROWS 1 COLUMN
        foot = new JLabel("Copyright...");
        content = new JPanel();
        info = new JLabel("");
        logo = new JLabel() {
    
            BufferedImage img;
    
            @Override
            public void paint(Graphics g) {
                try {
                    img = ImageIO.read(new File("logo.jpg"));
                } catch (IOException e) {
                }
                g.drawImage(img, 0, 0, null);
            }
        };
        window.add(view);
        header.add(logo);
        header.add(info);
        view.add(header);
        view.add(content);
        view.add(foot);
        window.setLocation(width / 2, 100);
       window.setSize(width, height);
        window.setPreferredSize(new Dimension(width, height));
        content.setSize(window.getWidth(), height-70);
        content.setPreferredSize(new Dimension(window.getWidth(), height-70));
    }
    

    “window”是框架…类没有扩展JFrame 我的类将成为其他类的超级类,子类继承公共内容JPanel。在我的超级类中,我试图设置GridLayout的3个部分的宽度和高度,logo和info组件的高度加起来是70…我将其他组件(view、header、info、logo)设置为私有,这样子类就不能访问它们。。。

    当应用程序运行时,将显示登录窗口,这将正确显示和调整大小。一旦登录到其中一个子类的实例中,登录窗口便会被隐藏站点setVisible(false)

    但是,当显示新窗口时,JFrame的大小是正确的,但是页眉、内容和页脚不是当前的大小。 我试过设置每个组件的大小和首选大小,但仍然不起作用…我还试过调用repaint和validate/revalidate

    有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   jzd    14 年前

    听起来你的设计是可以改进的。为什么这些变量必须是超类的属性?为什么不使用一个方法来构造所需的面板,并使用一个构造函数来添加它们,以便为每个实例获取新的面板呢?

    事实上,为什么不创建页眉和页脚类并重用它们,而不必为了得到相同的页眉和页脚而对框架进行子类划分呢?

        2
  •  1
  •   camickr    14 年前

    为什么要覆盖标签来绘制图像?

    1. 这就是setIcon()方法的作用
    2. 您不应该读取自定义绘制代码中的文件,因为此方法被多次调用
    3. 必要时,在paintComponent()方法中完成自定义绘制。
        3
  •  0
  •   salezica    14 年前

    尝试在将组件添加到容器之前设置首选大小,并“自下而上”添加组件。否则,试着打电话 pack() , revalidate() , repaint() 等来调整事物。

    阅读布局管理器,你也没有正确使用它们。

    而且,秋千也很烂。试试Netbeans,它会让你更容易忍受。当您需要手动放置和调整大小时,它也有很大帮助。