【问题标题】:Java 2D: Why won't my JPanel let me resize it?Java 2D:为什么我的 JPanel 不允许我调整它的大小?
【发布时间】:2012-01-21 02:05:18
【问题描述】:

好的,所以我正在尝试将 JPanel 添加到 JFrame 中:

            gameClasses[2] = new a2();
            gameClasses[2].setSize(100, 100);
            menu.add(gameClasses[2]);
            menu.setVisible(true);

a2() 是一个单独的类,它充当 JPanel,我使用 paintComponent 向它绘制图像。 “菜单”是 JFrame。我的问题是当我调用“gameClasses[2].setSize(100, 100);”时它不会调整 JPanel 的大小,但会保持相同的大小。有谁知道我做错了什么或应该如何做,因为互联网上似乎没有其他人对此有任何问题。谢谢。

编辑:这里是菜单和a2相关的代码:

            menu.setSize(swidth / 2 + swidth / 5, sheight / 2 + sheight / 5);
            menu.setLocation((swidth - menu.getWidth()) / 2, (sheight -     menu.getHeight()) / 3);
            menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            menu.setResizable(true);
            menu.remove(main);
            menu.add(gameClasses[0] = new a3());
            menu.add(gameClasses[1] = new a4());
            gameClasses[2] = new a2();
            gameClasses[2].setSize(100, 100);
            gameClasses[2].validate();
            menu.add(gameClasses[2]);
            menu.setVisible(true);

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class a2 extends JPanel {

public static int size = 48;
public static Image grsX = Toolkit.getDefaultToolkit().getImage("tiles/grsX.png");
public static Image grsY = Toolkit.getDefaultToolkit().getImage("tiles/grsY.png");
public static Image grsX1 = Toolkit.getDefaultToolkit().getImage("tiles/grsX1.png");
public static Image grsY1 = Toolkit.getDefaultToolkit().getImage("tiles/grsY1.png");

public a2() {
    System.out.println("a2 loaded...");
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //draw interface
    for(int y = 0; y < a6.ay; y++) {
        for(int x = 0; x < a6.ax; x++) {
            g.drawImage(a5.Tile_Img.get(a5.ID_Tile.get(a6.area[x][y])), x * size, y * size, size, size, this);
            if(x > 0) {
                if(a6.area[x - 1][y].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsX, x * size, y * size, size, size, this);
                }
            }
            if(x < a6.ax - 1) {
                if(a6.area[x + 1][y].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsX1, x * size, y * size, size, size, this);
                }
            }
            if(y > 0) {
                if(a6.area[x][y - 1].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsY, x * size, y * size, size, size, this);
                }
            }
            if(y < a6.ay - 1) {
                if(a6.area[x][y + 1].equals("00") && a6.area[x][y].equals("01")) {
                    g.drawImage(grsY1, x * size, y * size, size, size, this);
                }
            }
        }
    }
    repaint();
}

}

a3 和 a4 是扩展 JPanel 的 KeyListener 类和 MouseListener 类

【问题讨论】:

  • 除非您发布所有相关代码,否则不可能知道您哪里出错了。或者更好的是,SSCCE
  • gameClasses 是一个面板,menu 是一个(名字很差的)框架吗?这就是我的猜测,但由于我不喜欢猜测,我会第二次 Jeffrey 的建议发布一个 SSCCE。
  • 这就是所有相关代码,除了 a2 扩展了 JPanel 并且可以工作,我对菜单所做的唯一更改是 setLayout(null) 和 setResizable(true)
  • “所有相关代码” 如果您知道相关代码是什么,那么您将完成 98% 的修复。碰巧的是,setLayout(null) 是问题的核心。 不要那样做!
  • @MrDrProfessorTyler 在这种情况下,您使用menu 的任何地方和a2 的代码都是相关的。但是,您的问题几乎可以肯定是null LayoutManager

标签: java swing jframe jpanel paintcomponent


【解决方案1】:
  • 布局更可能尊重首选尺寸而不是尺寸。
  • 在框架上调用pack() 将使其成为显示内部组件所需的最小尺寸。添加完所有内容后调用它。
  • 不要打电话给setLayout(null)(在评论中提到的“不相关”代码)。 使用布局。

【讨论】:

  • 感谢它有点用,但是当我在菜单上调用 pack() 时,它会将菜单更改为 100 * 100 但不是 JPanel...还有其他建议吗?
  • 等待.. 没关系 pack() 使 JFrame 变小,但不是我为 JPanel 设置的大小
  • “还有其他建议吗?” 发布一个 S-S-C-C-E。(相对于大部分无用的代码 sn-ps和点点滴滴的信息。)
  • 我在上面发布和编辑的任何内容都与 SSCCE 一样好,可供所有人阅读。
  • @MrDrProfessorTyler 您发布的内容既不是独立的,也不是可编译的。它远不及 SSCCE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
相关资源
最近更新 更多