【问题标题】:Java Swing packs the window wrongJava Swing 打包窗口错误
【发布时间】:2010-10-11 22:10:01
【问题描述】:

我正在用 Java 制作类似 Scorched Earth 的游戏(用于我的考试项目:D),但我遇到了这个问题。我正在绘制一个窗口(JFrame),将布局设置为 BorderLayout,应用扩展的 JPanel,并打包窗口,但打包后,它在左侧和底部边框处显示了一些扩展的空白。

这是我的主要课程:

public class Main {
    public static void main(String[] args) {
        javax.swing.JFrame frame = new javax.swing.JFrame("game title");
        panel p = new panel(new java.awt.Dimension(512, 512));
        frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new java.awt.BorderLayout());
        frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}

panel 是我的 JPanel 类,它在构造函数中将它的首选大小设置为参数 (512x512)。我已经在 Windows 和 Linux 上对此进行了测试,并且在这两个地方都出现了错误,并且白色间隙的大小因操作系统而异。

这是我的面板类:

class panel extends javax.swing.JPanel{
    panel(java.awt.Dimension size){
        setPreferredSize(size);
    }
    public void paint(java.awt.Graphics g){
        g.setColor(java.awt.Color.BLUE);
        g.fillRect(0, 0, 512, 512);
    }
}

请帮忙!

【问题讨论】:

  • 您没有告诉我们您的小组课程。它有什么作用?构造函数参数有什么作用?您能否将问题简化为 SSCCE? sscce.org
  • 我没有看到您对提供的 Panel 类的问题。您还可以通过在两个地方硬编码面板的首选尺寸来重复自己。不要那样做!
  • 我有一个大小变量,其中包含我用来设置矩形大小的窗口大小,为了简单起见,这里将其删除。

标签: java swing


【解决方案1】:

我通过删除解决了这个问题:

setResizable(false);

【讨论】:

  • 我遇到了同样的问题,并通过删除 setResizable 方法解决了这个问题。但是还有其他方法可以防止窗口被调整大小吗?
【解决方案2】:

我查看了setResizable() 的代码,发现一切正常。只需将this.setResizable(false) 放在 this.pack() 之前。

【讨论】:

    【解决方案3】:

    sua,

    这不是你问的,但它永远是重要的......你不要在挥杆中覆盖 paint;而是覆盖 paintComponent

    参见 Sun 的“自定义绘画”教程:http://java.sun.com/docs/books/tutorial/uiswing/painting/

    事实上,我强烈建议(考虑到您选择的项目)您阅读整个 Swing 教程。这需要“一段时间”,但值得花时间。

    干杯。基思。

    【讨论】:

      【解决方案4】:

      我尝试在没有您的 panel 类的情况下重现此内容(需要一个更好的名称,至少应该使用 CamelCase 命名):

      import javax.swing.*;
      
      public class Main {
          public static void main(String[] args) {
              JFrame frame = new JFrame("game title");
              JPanel p = new JPanel();
              p.setPreferredSize(new java.awt.Dimension(512, 512));
              p.setBackground(java.awt.Color.BLUE);
              frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
              frame.getContentPane().setLayout(new java.awt.BorderLayout());
              frame.getContentPane().add(p, java.awt.BorderLayout.CENTER);
              frame.pack();
              frame.setResizable(false);
              frame.setVisible(true);
          }
      }
      

      这会生成一个带有蓝色 512x512 面板且没有不同颜色边框的窗口。所以问题一定出在你的panel 类上。

      【讨论】:

      • 什么是 522x522?窗户?还是面板?我的面板正好是 512x512,而 Window 显然比这大一点。
      • 面板是 522x522
      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多