JPanel不会调整大小

时间:2010-11-29 16:26:39

标签: java swing jframe jpanel

我的代码:

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个部分的宽度和高度,徽标和信息组件的高度加起来为70 ...我已经设置了其他组件(视图,标题,信息) ,logo)private,以便子类无法访问它们......

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

但是当显示新窗口时,JFrame的大小正确,但标题,内容和页脚不是当前大小。 我已经尝试设置每个组件的大小和首选大小但仍然无法正常工作......我也尝试过调用重绘并验证/重新验证

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

听起来你的设计可以改进。为什么这些变量需要是超类的属性?为什么不只是有一个构造你需要的面板的方法和一个添加它们的构造函数,以便为每个实例获得新的面板?

实际上,为什么不只是创建页眉和页脚类并重用它们而不必为了获得相同的页眉和页脚而继承子框架?

答案 2 :(得分:0)

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

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

另外,Swing很糟糕。尝试使用Netbeans,它会让它变得更加可忍受。当你需要手动放置和调整大小时,它会有很大的帮助。