只绘制bufferedimage的一部分

时间:2017-02-01 20:09:59

标签: java swing bufferedimage paintcomponent

我正在设计纸牌游戏,我想在面板上绘制(绘画)一张卡片。但是,当我画画时,只有一小部分图像在显示。您可以在此屏幕截图中看到它:

Image of frame and small section of card

我为BufferedImage编写了一个包装类(CardImage):

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class CardImage {

BufferedImage img = null;

public CardImage() {

}

public BufferedImage setImage(Card c) {
    try {
        img = ImageIO.read(new File("/media/billy/HOME/workspace/Shithead/src/cards/" + toName(c)));
    } catch(Exception e) {
        System.out.println(e);
    }

    /*
    int scale_factor = 8;
    System.out.println(img.getHeight());
    Image dimg = img.getScaledInstance((int)img.getWidth()/scale_factor, (int)img.getHeight()/scale_factor, Image.SCALE_SMOOTH);


    Graphics g = img.createGraphics();
    g.drawImage(dimg, 0, 0, null);
    g.dispose();
    */


    return img;
}

public String toName(Card c) {
    String tmp = c.toString().replaceAll(" ", "_");
    tmp = tmp.toLowerCase();
    tmp = tmp + ".png";
    return tmp;
}

}

我有一个扩展JPanel的HandPanel,我想在其中绘制CardImage BufferedImage:

import java.awt.Graphics;

import java.awt.image.BufferedImage;


import javax.swing.JPanel;


public class HandPanel extends JPanel {

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    CardImage cardImage = new CardImage();

    Card card = new Card(2,2);
    BufferedImage img = cardImage.setImage(card);
    System.out.println(img.getHeight(null) + " " + img.getWidth(null));

    g.drawImage(img, 0, 0,  null);

}


}

我还有一个包含HandPanel的类:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ShitGUI {
public static void main(String[] args) {
    ShitGUI gui = new ShitGUI();
}


JFrame frame = new JFrame();
JPanel mainPanel = new JPanel();
public ShitGUI() {
    mainPanel.setPreferredSize(new Dimension(500,500));

    HandPanel pan = new HandPanel();

    mainPanel.add(pan);

    frame.add(mainPanel);
    frame.pack();
    frame.setVisible(true);
}



}

卡的图像相当大(创建卡片(2,2)只是心中的2个,我知道我正确地获得了路径。)

感谢任何帮助。谢谢!

N.B。当我取消注释包含dimg的部分时,我获得了缩小的红色卡片(而不是黑色和白色,而不是缩放图像,否则我得到)。我理解缩放,但我不明白为什么我的方法给我一个黑白图像。

1 个答案:

答案 0 :(得分:3)

可能的直接问题是HandPanel没有提供任何大小调整提示,以允许布局管理员确定组件的最佳大小,而忽略它的默认首选大小{{1} }

我回去稍微修改了你的代码,使其更加可重用。

0x0是一个坏主意。

在构建应用程序后,您永远不应该引用任何包含img = ImageIO.read(new File("/media/billy/HOME/workspace/Shithead/src/cards/" + toName(c)));src的路径。您不应该src引用嵌入式资源,它们不是(或者至少不会在构建应用程序时获胜),而是需要使用File

Class#getResource

我修改了public class CardImage { BufferedImage img = null; public CardImage(Card card) { setImage(card); } public BufferedImage getImage() { return img; } public BufferedImage setImage(Card c) { try { //img = ImageIO.read(new File("/media/billy/HOME/workspace/Shithead/src/cards/" + toName(c))); img = ImageIO.read(getClass().getResource("/cards/" + toName(c))); } catch (Exception e) { System.out.println(e); } /* int scale_factor = 8; System.out.println(img.getHeight()); Image dimg = img.getScaledInstance((int)img.getWidth()/scale_factor, (int)img.getHeight()/scale_factor, Image.SCALE_SMOOTH); Graphics g = img.createGraphics(); g.drawImage(dimg, 0, 0, null); g.dispose(); */ return img; } public String toName(Card c) { String tmp = c.toString().replaceAll(" ", "_"); tmp = tmp.toLowerCase(); tmp = tmp + ".png"; return tmp; } } 类,因此需要事先进行设置,这样可以缓存图像并更有效地重复使用。我还考虑使用某种工厂,当传递CardImage时,可以确定是否需要生成Card的新实例或重新使用以前缓存的版本,这样做使代码执行起来更快。

同样,我已经修改了CardImage,它现在要求您将HandPanel传递给它,并使用它来确定将用于生成大小提示的信息< / p>

Card

我还建议您查看Perials of getScaledInstanceJava: maintaining aspect ratio of JPanel background image以寻找其他替代方案