Java Swing JFrame 背景图片无法显示

heartlc 2013-08-14 10:56:40
各位大神,我最近在学Swing编程,我最近遇到一个问题,我没办法将图片在显示出来。我看网上都是这么写的,我不知道,是我的JDK本身的问题,还是代码的问题,希望各位大神帮忙看看!代码如下:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class KFrame extends JFrame
{

private ImageIcon background1; //背景
private JPanel jpanel1; //面板


KFrame()
{
this.setTitle("Frame");
this.setBackground();
//this.setUndecorated(true);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
//设置背景
private void setBackground()
{
//背景图片
background1 = new ImageIcon("Image\\Background\\background2.jpg");

JLabel label = new JLabel(background1);

//获得窗口内容的面板
jpanel1 = (JPanel)this.getContentPane();
//使面板透明化
jpanel1.setOpaque(true);

//加入背景
this.getLayeredPane().add( label,new Integer(Integer.MIN_VALUE) );
this.setBounds( 0,0,background1.getIconWidth(),background1.getIconHeight() );
}

public static void main( String[] args )
{
KFrame f = new KFrame();
}
}


还如,如果将this.getLayeredPane().add( label,new Integer(Integer.MIN_VALUE) );换成 jpanel1.add( label ) 就可以显示了。但是这样的话,我要加入控件,背景同样无法显示。

还有一个问题,如果这样设置窗口的大小,由于标题栏和边框的存在,没有办法完全显示图片的大小,不知道大家有别有什么好的方法处理这个问题?
...全文
1055 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fearlessMore 2013-08-15
  • 打赏
  • 举报
回复
引用 楼主 heartlc 的回复:
各位大神,我最近在学Swing编程,我最近遇到一个问题,我没办法将图片在显示出来。我看网上都是这么写的,我不知道,是我的JDK本身的问题,还是代码的问题,希望各位大神帮忙看看!代码如下:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class KFrame extends JFrame
{

       private ImageIcon background1;    //背景
       private JPanel jpanel1;           //面板


       KFrame()
       {
             this.setTitle("Frame");           
             this.setBackground();            
             //this.setUndecorated(true);
             this.setVisible(true);
             this.setDefaultCloseOperation(EXIT_ON_CLOSE);                  
       }
         //设置背景
       private void setBackground()
       {
               //背景图片
               background1 = new ImageIcon("Image\\Background\\background2.jpg");

               JLabel label = new JLabel(background1);

               //获得窗口内容的面板
               jpanel1 = (JPanel)this.getContentPane();              
               //使面板透明化
               jpanel1.setOpaque(true);  
               
               //加入背景
               this.getLayeredPane().add( label,new Integer(Integer.MIN_VALUE) );
               this.setBounds( 0,0,background1.getIconWidth(),background1.getIconHeight() );               
       }

       public static void main( String[] args )
       {
              KFrame f = new KFrame();
       }
}
还如,如果将this.getLayeredPane().add( label,new Integer(Integer.MIN_VALUE) );换成 jpanel1.add( label ) 就可以显示了。但是这样的话,我要加入控件,背景同样无法显示。 还有一个问题,如果这样设置窗口的大小,由于标题栏和边框的存在,没有办法完全显示图片的大小,不知道大家有别有什么好的方法处理这个问题?
在解决你的问题之前,有几点需要说明: 1、现在Java界面编程真的不是首选。可插拔式的Look and feel不论基于Basic 还是Metal (参考网络上的BeautyEye Lnf)编写繁琐,开发周期长。后来1.7退出的Synth基于XML导入式概念虽然新颖,但是对于Components properties的支持不够。基于Nimbus编写的话,首先运行效率不如Metal,然后重绘每个Component也很麻烦,用图片做背景需要九宫格技术的支持。无论如何,Look and feel由于Java内部本身的限制,提供定制的范围确实有限,有些东西你customize不了,因为它没有提供那样的接口。 2、但是简单的界面编写如对动态效果没什么要求,对Desktop集成没什么要求(Java需要调用JNI来集成一些桌面特性,如WIn7任务栏图片的进度加载显示,还有比如SystemTray也只能用AWT的PopupMenu导致没法定制出和QQ、迅雷等一样的托盘效果),使用Swing还是可以的,Swing的优势也就在于跨平台性好,由于SWT。建议简单界面能使用Swing的还是不要使用SWT,对于简单界面编写L&F也搓搓有于了。 3、对于想要Charts、多媒体支持、动画效果、滤镜支持、触摸事件感应处理等富Internet绚丽界面的追求的话,建议选择用JavaFX,可插拔式用外部链接的CSS代替,一般界面的编写可以用FXML,逻辑处理用Java语言。这样结构化很明显,也很现代化。但是JavaFX目前Bug还是很多,很多功能不完善,比如SysteraymT没有支持,Print打印功能也是在未来Java8中绑定,但是对于打印表格table似乎还没有支持。其UI组件未来会逐渐增多。 4、目前的话Java界面编写还是JavaFX比较有前途,但是就目前的JavaFX而言并没有什么明显的竞争力,只能期待以后的发展了。 5、建议还是用目前主流的软件编写工具。想要在Windows下使用的话,还是尽量调用本地化的windows API 6、用数据库相结合的小软件编写,Java还是不错的。内置的JavaDB就不错,MySQL以及Microsoft Database也有很多开发案例,使用Oracle大型数据库就更不用说了。 最后,你的问题,一般我们不用getLayeredPane().使用LayeredPane 等直观,详见我的博客举例对比。然后是你使用Swing,一定要深刻理解java界面的绘图机制。像背景图片什么绘制是很简单的,至于图像的缩放,运用ImageOP写个缩放的,或者模糊效果等等,根据addComponentListener()中的componentResize()来缩放就可以了。绘制Border或者Button的背景,图片最好使用九宫格技术,防止图片拉伸失真。使用Synth的话它自带这样的技术。否则建议引入Android的NinePatch技术。详见我的CSDN博客。
失落夏天 2013-08-15
  • 打赏
  • 举报
回复
我建议书重写paintComponent方法更合适。 先创建image对象,然后 public void paintComponent(Graphics g) { super.paintComponent(g); setBackground(Color.WHITE); if (image != null) { int height = image.getHeight(this); int width = image.getWidth(this); if (height != -1 && height > getHeight()) height = getHeight(); if (width != -1 && width > getWidth()) width = getWidth(); int x = (int) (((double) (getWidth() - width)) / 2.0); int y = (int) (((double) (getHeight() - height)) / 2.0); g.drawImage(image, x, y-50, width, height, this); } }

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧