更改后JLabel Icon未显示

时间:2014-05-23 19:53:56

标签: java swing jlabel

我尝试查找这个问题,但大多数答案都是文件路径错误,但很可能并非如此。该文件在我第一次使用时工作。

我正在制作战舰游戏,并使用JLabels在地图上显示战舰。我想制作一个按钮来将船从水平旋转到垂直,但当我尝试更改它时,它的图标会消失。

当我运行这个构造函数代码时:

public Ship(int size, String direction, boolean active, Client c,
        ClientGUI cg) {
    this.c = c;
    this.cg = cg;
    health = size;
    this.active = active;
    this.direction = direction;

    file = "img/" + Integer.toString(health) + direction + ".png";   // String
    try {
        System.out.println(file);
        tx = ImageIO.read(new File(file));    // BufferedImage
    } catch (IOException e) {

        e.printStackTrace();
    }
    texture = new JLabel(new ImageIcon(tx));
    if (direction.equals("v"))
        texture.setBounds(0, 0, 40, 40 * size);
    else
        texture.setBounds(0, 0, 40 * size, 40);
    texture.setVisible(true);

}

一切正常,我可以看到图像。

然后我尝试使用几乎相同的代码旋转它:

void rotate() {
    if (direction.equals("h")) {
        direction = "v";
        file = "img/" + Integer.toString(health) + direction + ".png";
        try {
            System.out.println(file);
            tx = ImageIO.read(new File(file));
        } catch (IOException e) {

            e.printStackTrace();
        }
        texture.setBounds(0,0,40, 40 * size);
        texture.setIcon(new ImageIcon(tx));

    } else {
        direction = "h";
        file = "img/" + Integer.toString(health) + direction + ".png";
        try {
            System.out.println(file);
            tx = ImageIO.read(new File(file));
        } catch (IOException e) {

            e.printStackTrace();
        }
        texture.setIcon(new ImageIcon(tx));
        texture.setBounds(0,0,40 * size, 40);
    }

    cg.repaint();    // not sure if I need to do this
}

它消失了......

我尝试放置两艘船,一艘是旋转的,它只是错过了JLabel或JLabel上的图标。enter image description here

2 个答案:

答案 0 :(得分:1)

如果您通过调用更改其状态的方法更新JLabel texture,则可能会立即更新,也可能不会立即更新,除非您致电texture.repaint()texture.paintAll(texture.getGraphics())或某种类似方法。< / p>

另外,我会考虑使用LayoutManager来处理用于保存JLabel网格的任何上层组件。如果您使用游戏板的GridLayout并且:

  1. 使用texture.setPreferredSize(Dimension)设置JLabel的首选尺寸,并在设置游戏时调用frame.pack()一次;或

  2. 将JLabel的大小设置为label.setSize(Dimension)一次,不要打包JFrame

  3. 您只需要设置一次JLabel的大小,而不是每次都将新的ImageIcon设置为标签。因为,理想情况下,你的游戏不应该进行任何额外的工作,因为它的执行速度更快。

    我还建议将每个可能的ImageIcon保存为类中的静态字段,而不是每次都从文件中访问它们。这样,您可以从静态初始化方法中读取一次,然后在更改方向时可以直接访问船舶。

答案 1 :(得分:0)

  

我想制作一个按钮,将船从水平旋转到垂直

您可以使用Rotated Icon类为您进行轮换。