eclipse写的窗体在运行时图片能正常显示,打成jar包后无法显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eclipse写的窗体在运行时图片能正常显示,打成jar包后无法显示相关的知识,希望对你有一定的参考价值。

这是我创建的程序,导入了图片文件

在eclipse中运行,图片能正常显示

可是将它打成jar包导出后,图片就没有了

而用解压工具看jar包中的文件,发现导入的图片都在

为什么图片就是不出现呢

1、这种情况下你需要把图片拿出来跟jar同目录存放就可以看到了。
试下看吧。追问

还真行了,不过这样有点麻烦,有没有打包一次,一下子就能正常运行的方法呢

追答

1、这个是常见问题,主要是跟路径的寻找有关系。
2、解决方法我就不自己写了,篇幅太长,直接看个不错的文章更好些,
http://blog.csdn.net/xkwong/article/details/6558746

追问

谢谢了

参考技术A 图片不能在jar里面啊。你程序读取时路径里不存在图片就显示不出。把图片弄到一个文件夹里在生成jar文件

简单21点纸牌小游戏纸牌显示的修改

上次写的随笔,简单21点纸牌小游戏,当窗体大小改变时,纸牌画面会出现不显示的问题,因为每一张牌都是用GDI+的方法,从图片中剪裁下来的,没有用到vs提供的控件,如PictureBox控件,这就需要自己在窗体的Paint事件中来重新绘制图片,这样在窗体大小改变时,就能够正常显示纸牌图片了,代码中纸牌父类PKFather中的x,y参数,提供的就是纸牌在窗体中的实际坐标,也就是每张纸牌类要在窗体中显示时,都已经提供了在窗体上的坐标,那么问题解决就简单了,将需要在窗体上显示的那几张牌另外创建个集合,这个集合只要不为空,就在paint事件调用,这样在窗体大小改变时就能重新绘制纸牌了。代码如下

public partial class Form1 : Form
        //程序开始部分定义用来存储需要显示的牌
        private List<RPoker> pCard = new List<RPoker>();

 private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (pCard.Count > 0)
            {
                foreach (var item in pCard)
                {
                    item.Draw(e.Graphics);
                }
            }
         }

private void button1_Click(object sender, EventArgs e)//开始游戏
        {
            pCard.Clear();
            this.Refresh();
            button1.Enabled = false;
            label1.Text = "";
            label2.Text = "";
            label1.Refresh();
            label2.Refresh();
            computerNumber = 0;
            playerNumber = 0;
            playerCount = 0;
            computerCount = 0;
            //画玩家第一张牌
            allCard[TopCard].X = 200;
            allCard[TopCard].Y = 200;
            allCard[TopCard].Draw(this.CreateGraphics());
 
            pCard.Add(allCard[TopCard]);//要显示牌加入集合
            if (allCard[TopCard].Rank > Rank.Ten)
            {
                playerCount += 10;
                playerNumber += 1;
            }
            else
            {
                playerCount += (int)allCard[TopCard].Rank;
                playerNumber += 1;
            }
            TopCard++;
            if (TopCard >= 54)
            {
                Shuffle();
                MessageBox.Show("新的一副牌!!");
            }
            label2.Text = playerCount.ToString();
            label2.Refresh();
            label3.Text = playerNumber.ToString();
            label3.Refresh();
 
            //画计算机第一张牌
            allCard[TopCard].X = 200;
            allCard[TopCard].Y = 40;
            allCard[TopCard].Draw(this.CreateGraphics());
            pCard.Add(allCard[TopCard]);//要显示牌加入集合
            if (allCard[TopCard].Rank > Rank.Ten)
            {
                computerCount += 10;
                computerNumber += 1;
            }
            else
            {
                computerCount += (int)allCard[TopCard].Rank;
                computerNumber += 1;
            }
            TopCard++;
            if (TopCard >= 54)
            {
                Shuffle();
               // pCard.Clear();
                MessageBox.Show("新的一副牌!!");
            }
            label1.Text = computerCount.ToString();
            label1.Refresh();
            label4.Text = computerNumber.ToString();
            label4.Refresh();
 
            //画玩家第二张牌
            allCard[TopCard].X = 225;
            allCard[TopCard].Y = 200;
            allCard[TopCard].Draw(this.CreateGraphics());
            pCard.Add(allCard[TopCard]);//要显示牌加入集合
            if (allCard[TopCard].Rank > Rank.Ten)
            {
                playerCount += 10;
                playerNumber += 1;
            }
            else
            {
                playerCount += (int)allCard[TopCard].Rank;
                playerNumber += 1;
            }
            TopCard++;
            if (TopCard >= 54)
            {
                Shuffle();
                MessageBox.Show("新的一副牌!!");
            }
            label2.Text = playerCount.ToString();
            label2.Refresh();
            label3.Text = playerNumber.ToString();
            label3.Refresh();
 
            //画计算机第二张牌
            allCard[TopCard].X = 225;
            allCard[TopCard].Y = 40;
            allCard[TopCard].Draw(this.CreateGraphics());
            pCard.Add(allCard[TopCard]);//要显示牌加入集合
            if (allCard[TopCard].Rank > Rank.Ten)
            {
                computerCount += 10;
                computerNumber += 1;
            }
            else
            {
                computerCount += (int)allCard[TopCard].Rank;
                computerNumber += 1;
            }
            TopCard++;
            if (TopCard >= 54)//
            {
                Shuffle();
                MessageBox.Show("新的一副牌!!");
            }
            label1.Text = computerCount.ToString();
            label1.Refresh();
            label4.Text = computerNumber.ToString();
            label4.Refresh();
            button2.Enabled = true;
            button3.Enabled = true;
        }

 

其它地方的代码,只要是需要显示的牌,都加入到pCard集合中,当然还要在开始游戏的代码开头处加入pCard.Clear(),每次开始游戏前清空下集合,不然窗体显示的就不一定是本轮的纸牌。

其实同一个问题,也可以有多种解法,在网上看到也有用Timer控件,来定时刷新窗体重新绘制的方法,使用这种方法要定义一个开关项,不然定时刷新重绘,窗体会不断闪烁,开关项的定义也比较繁琐,不过也是一种解决办法,如果还有更好的方法,也请大家指教。


 


 

以上是关于eclipse写的窗体在运行时图片能正常显示,打成jar包后无法显示的主要内容,如果未能解决你的问题,请参考以下文章

简单21点纸牌小游戏纸牌显示的修改

Java程序打成Jar包全过程

winform 中怎样让窗体能拖动(移动),但是不改变窗体的大小(宽和高)

请问一下我在Qt一应用程序中,在构造函数里面写的widget比如按钮这些,运行后都无法显示,只有一空白窗体

eclipse打成jar包后找不到类,是怎么回事呢,主类文件打包时已经选了,虚拟机也装了,还是运行不了

C# - Winform: 在窗体加载的过程中截获异常,如何不让窗体显示出来。