【问题标题】:JPanel won't resizeJPanel 不会调整大小
【发布时间】:2011-05-17 09:14:52
【问题描述】:

我的代码:

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) 私有,以便子类无法访问它们...

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

然而,当显示新窗口时,JFrame 的大小是正确的,但页眉、内容和页脚不是正确的大小。 我已经尝试设置每个组件的大小和首选大小,但仍然无法正常工作......我也尝试过调用 repaint 和 validate/revalidate

有什么想法吗?

【问题讨论】:

    标签: java swing jframe jpanel


    【解决方案1】:

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

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

    【讨论】:

    • 我认为我的设计需要重新设计...感谢大家的指点,回到绘图板
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在将组件添加到容器之前尝试设置首选尺寸,并“自下而上”地添加组件。否则,请尝试致电pack()revalidate()repaint() 等进行调整。

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

      另外,Swing 很烂。试试Netbeans,它让它更容易忍受。当您需要手动放置和调整大小时,它也很有帮助。

      【讨论】:

      • 不要使用 IDE 来生成 GUI。学习如何自己编写代码,这样你学习的是 Java 而不是 IDE。
      • 除非你和我一样讨厌 Java,但由于某种原因你必须使用 Swing :P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      相关资源
      最近更新 更多