添加到特定JPanel的图像不清晰

时间:2014-04-24 02:57:44

标签: java image swing debugging jpanel

背景信息:我有一个带有gridlayout(5,7)的JFrame,我正在尝试将图像添加到(0,0)的单元格中

关于将图片添加到特定JPanel,我正在关注此guide

要在JPanel单元格中显示图像:

  1. 列表项
  2. 将芯片图像放入ImageIcon
  3. 通过JLabel的setIcon(chipIcon)方法将ImageIcon放入JLabel
  4. 通过add(someLabel)方法将JLabel添加到JPanel - JPanel现在将显示图像。
  5. 问题

    图像被添加到JPanel中,但似乎图像被放大了很多,然后被添加到JPanel。

    现实

    enter image description here

    期望

    enter image description here

    可编辑的源代码

    package testing;
    
    import java.io.*;
    import java.util.*;
    import java.security.*;
    import javax.xml.bind.DatatypeConverter;
    import java.lang.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    
    
    public class Testing extends JPanel 
    {
    
        public static class TestPanel extends JPanel
    {
        TestPanel()
        {
            int i = 5; // num of rows
            int j = 7; // num of cols
    
            PanelHolder = new JPanel[i][j];
            setLayout(new GridLayout(i,j));
    
            for (int m=0 ; m<i;m++)
            {
                for(int n=0;n<j;n++)
                {
                    PanelHolder[m][n] = new JPanel();
                    add(PanelHolder[m][n]);
                }
            }
    
    
    
    
    
            ImageIcon ic1 = new ImageIcon("./src/testing/Ace_Diamond_1_1.png");
            JLabel jl1 = new JLabel();
            jl1.setIcon(ic1);
            PanelHolder[0][0].add(jl1);
    
    
    
        }
          JPanel [][] PanelHolder;
    
        JLabel DeckLabel;
        JPanel DeckPanel;
        ImageIcon Deckimg;
    
        private BufferedImage image;
        BufferedImage image2;
    
    }
    
    
    public static class ImagePanel extends JPanel
    {
        ImagePanel(BufferedImage image)
        {
            this.i = image;
    
        }
    
    
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
    
            g.drawImage(i,0,0, getWidth(), getHeight(), this);
    
    
    
        }
    
    
        BufferedImage i;
    }
    
    
    
    
        public static void main(String[] args) 
        {
            TestPanel tp = new TestPanel();
    
            JFrame frame = new JFrame();
    
            frame.add(tp);
            frame.pack();
            frame.setVisible(true);
    
    
        }
    
    
    }
    

    下载图片here

    注意:由于某些未知原因,您必须清理并重建解决方案以进行任何更改,否则它将坚持旧代码

1 个答案:

答案 0 :(得分:1)

最有可能的问题是,您的卡片图像尺寸(691x963)对于您的手机来说太大了。这将使您的主框架至少宽3455像素,高6741像素......:P

您需要缩小原始图像的尺寸或动态缩放,例如......

BufferedImage card = ImageIO.read(getClass().getResource("/Ace_Diamond_1_1.png"));
Image scaledInstance = card.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
JLabel jl1 = new JLabel(new ImageIcon(scaledInstance));

我应该指出getScaledInstance不是缩放图片的最佳选择,有关更详细的讨论,请参阅The Perils of Image.getScaledInstance(),并查看Quality of Image after resize very low -- Java以寻找替代方法