我加入一张图片做关闭jframee的背景,但用Jable加入图片后,按钮之类的控件就不见了,要点击才能显示

急!!怎么样在jpanel中添加背景图片,而又不会把在jpanel中的按钮覆盖?就是怎么样把图片相设制在最低层_百度知道
急!!怎么样在jpanel中添加背景图片,而又不会把在jpanel中的按钮覆盖?就是怎么样把图片相设制在最低层
按钮有图片我在jpanel中有按钮?为什么,当我添加背景图片时总是会覆盖了按钮的图片
通过背景图片设置图片 注意MyPanel是自己定义的一个类
jpanel=new MyPanel(image); /).JLabel, 0,两个实现了在图片上添加按钮的功能
this.JPanel.setIconImage(image);a,400).JBImageIcon labIma=new ImageIcon(&quot.setTitle(&
jlabel=new JLabel().MIN_VALUE));固定背景图片;
jbutton=new JButton().).
init();//public
=JButton jbutton.JFimport javax.getIconWidth().add(jpanel)要注释掉jpanel = (JPanel)我是按钮&&#47.add(jbutton).IJPanel 透明模式
jlabel = new JLabel(labIma););
MyPanel(Image image)
this.add(jlabel),因此上面构造函数中的}public void init(){&#47.setIcon(labIma).从JFrame 里面创建一个JPanel
jpanel.getImage().awt.add(jb).getHeight();&#47.jpg&quot,
0.swing.JP&#47.Image image=new ImageIcon(&创建个带背景图片的JLabel */
*/&#47.setOpaque(false).swing.setLayout(new FlowLayout());*第三种方法 通过重写JPanel中的paintComponent方法设置背景图片;
this重写JPanel的paintComponent方法简单类方法如下;import javax.awt,
this).add(*第一种方法 通过JLabel简单的设置图片
jpanel=new JPanel();t.ImageIcon.swing,
this, labIma.getWidth(); /image&#47.image
image.setText(&public class Test extends JFrame{JP*&#47, labIma,然后在jpanel上添加组件
&#47,注意它里面的jpanel不用显示的添加到JFrame中.add(jpanel).jpg&Test(){
image/&#47.getIconHeight());}public static void main(String args[]){Test t=new Test().swing,允许这个JPanel可以在图片上添加其他组件
paintComponent(Graphics
*第二种方法 这是实现在JLabel添加图片同时在上面添加按钮功能;JLabel jlabel.setSize(400.drawImage(
jpanel, new Integer(I
}测试JFramepackage src,
0;本方法里面有三种显示图片的方法;import java:);a.setBounds(0.setVisible(true);t.ImageI /hello&quot.getContentPane();haha&quot.JL
JButton jb = new JButton(&quot.getLayeredPane();
为您推荐:
其他类似问题
jpanel的相关知识
等待您来回答java知识点记录(1)
一、JFrame 的层次结构
我们通过两个图来说明一下 JFrame 的层次结构:
从视觉效果来看(从 View 层来看),一个 JFrame 的结构是这样的:
可以看出,
Frame 的最底层是 RootPane,
然后是 LayeredPane
再上面就是 ContentPane
最顶层是 GlassPane
最顶层的 GlassPane 默认是透明的,
关于 GlassPane 这个层次,其实有很多可以利用的技巧,以后我再慢慢告诉大家,
今天说我们的重点:ContentPane&
可以看出,这个 ContentPane 就是默认盛放控件的那个层次,
那 ContentPane 在默认的情况下又是什么呢?
我们来看两个方法:
JFrame 中的 getContentPane:
public Container getContentPane() {
return getRootPane().getContentPane();
JRootPane 中的 createContentPane:
protected Container createContentPane() {
JComponent c = new JPanel();
可以明显的看出,默认的 ContentPane 就是一个 JPanel;
现在我们再来看另一张图,从模型的角度来看
JFrame 的层次:
可以看出,其实 ContentPane 是添加在 LayeredPane 上的一个控件。
而 LayeredPane 和 GlassPane 是直接添加在 RootPane 上的,
RootPane 直接添加在 JFrame 上。
其实你只要记住:
1、你现在不再需要去 getContentPane(),
2、ContentPane 默认是一个 JPanel ,
这两个结论就可以了……
二、java中如何对JFrame设置背景颜色及背景图片
setVisible()说明:当设置为flase时,组件本身及增加在该组件上的组件都不可见;
setOpaque()说明:
当设置为flase时,只针对设置了透明的组件,其他组件不受影响;&
Java窗口是指JFrame或者Frame
其次,窗口背景颜色是指直接调用JFrame或者Frame的setBackground(Color color)方法设置后显示出来的颜色。其实,J在你直接调用这个方法后,你的确设置了背景颜色,而你看到的却不是直接的JFrame或者Frame,而是JFrame.getContentPane().而JFrame上的contentPane默认是Color.WHITE的,所以,无论你对JFrame或者Frame怎么设置背景颜色,你看到的都只是contentPane.
最后,讲解决办法:
办法A:在完成初始化,调用getContentPane()方法得到一个contentPane容器,然后将其设置为不可见,即setVisible(false)。这样,你就可以看到JFrame的庐山真面貌啦!
核心代码this.getContentPane().setVisible(false);//得到contentPane容器,设置为不可见
方法B:将contentPane的颜色设置为你想要的颜色,而不是对JFrame本身设置;
核心代码:this.getContentPane().setBackground(Color.red);//设置contentPane为红色
将核心代码替换方法A核心代码即可实现
方法C:为JFrame添加一个Panel或者JLabel等其他组件,设置其颜色为你想要的颜色,然后将其覆盖JFrame窗口即可
JFrame默认是BorderLayout
JPanel默认是FlowLayout
1.JFrame设置背景色,注意体会注释的
package com.&import java.awt.Cimport javax.swing.JF
public class Test extends JFrame
public static void main(String[] args)
&& new Test();
public Test()
&& this.setSize(400,300);
&& this.setLocation(400,300);
&& this.setBackground(Color.blue);
&& this.getContentPane().setBackground(Color.red);
&& this.getContentPane().setVisible(false);//如果改为true那么就变成了红色。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&& this.setVisible(true);
2.给JFrame设置背景图片。
&&&&& 方法1:通过在JFrame中添加一个JPanel,背景图片放在JPanel上来实现。代码如下:
import java.awt.*;&
import javax.swing.*;
public class Test extends JFrame
//创建一个容器
//创建背景面板。
BackgroundP
//创建一个按钮,用来证明我们的确是创建了背景图片,而不是一张图片。
public static void main(String[] args)
&& new Test();
public Test()
&& //不采用任何布局方式。
ct=this.getContentPane();
&& this.setLayout(null);
&& //在这里随便找一张400*300的照片既可以看到测试结果。
bgp=new BackgroundPanel((new ImageIcon(&images\\background.jpg&)).getImage());
&& bgp.setBounds(0,0,400,300);
&& ct.add(bgp);
&& //创建按钮
jb=new JButton(&测试按钮&);
jb.setBounds(60,30,160,30);
&& ct.add(jb);
&& this.setSize(400,300);
&& this.setLocation(400,300);
&& this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&& this.setVisible(true);
class BackgroundPanel extends JPanel
public BackgroundPanel(Image im)
&& this.im=
&& this.setOpaque(true);
//Draw the back ground.
public void paintComponent(Graphics g)
&& super.paintComponents(g);
&& g.drawImage(im,0,0,this.getWidth(),this.getHeight(),this);
方法2:我们用JLayeredPane,JLayeredPane 为 JFC/Swing 容器添加了深度,允许组件在需要时互相重叠。Integer 对象指定容器中每个组件的深度,其中编号较高的组件位于其他组件之上
* 给JFrame 添加一个背景图案。
package com.&
import javax.swing.*;
&public class JFrameBackground4 extends JFrame
//创建一个JLayeredPane用于分层的。
JLayeredPane layeredP
//创建一个Panel和一个Label用于存放图片,作为背景。
//创建一个按钮用于测试的。
public static void main(String[] args)
&& new JFrameBackground4();
public JFrameBackground4()
&& layeredPane=new JLayeredPane();
&& image=new ImageIcon(&images\\background.jpg&);//随便找一张图就可以看到效果。&&
//创建背景的那些东西
jp=new JPanel();
&& jp.setBounds(0,0,image.getIconWidth(),image.getIconHeight());&&&
& &jl=new JLabel(image);
//&& jl.setBounds(0,0,image.getIconWidth(),image.getIconHeight());
&& jp.add(jl);
&& //创建一个测试按钮
jb=new JButton(&测试按钮&);
jb.setBounds(100,100,100,100);
&& //将jp放到最底层。
layeredPane.add(jp,JLayeredPane.DEFAULT_LAYER);
&& //将jb放到高一层的地方
layeredPane.add(jb,JLayeredPane.MODAL_LAYER);
&& this.setLayeredPane(layeredPane);
&& this.setSize(image.getIconWidth(),image.getIconHeight());
&& this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&& this.setLocation(image.getIconWidth(),image.getIconHeight());
&& this.setVisible(true);&
第二个程序和三个程序的窗体
Java中有关Frame背景的设置总结
我们在进行图形用户界面编程时,为了做出一个漂亮、个性化的界面,那么界的背景就必须考虑了。
要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java编程中没有直接设置背景的有关方法,
了解一些基本知识后我们就可以随意设置背景了。
&首先还是要了解框架JFrame中的层次结构。
JFrame中的层次分布及相对关系是:
最底层是:JRootPane;
第二层是:JlayerPane,这层上面包含一层ContentPane(默认不透明),也正是我们常说的内容面板。
所以一般我们拖放的控件就是在ContentPane层上。;
最上层就是:GlassPane(默认是透明的);
有了这些常识后我们就可以随意设计背景了。
在这里笔者提供两种方法为一个
frame设置一张背景图片。
我们把图片放置在第二层:JlayerPane容器上,然后让最上层的:
ContentPane透明,这样就实现了背景的设置。(当然把图片放置最低层,让上面两层透明也是可以的)
&具体步骤:
&//&加载背景图片
&ImageIcon bg =&new&ImageIcon(&background.jpg&);
&//&把背景图片显示在一个标签里
&JLabel label =&new&JLabel(bg);&
//把标签的大小位置设置为图片刚好填充整个面
label.setBounds(0,0,bg.getIconWidth(),bg.getIconHeight());&
//添加图片到frame的第二层
&frame.getLayeredPane().add(label,newInteger(Integer.MIN_VALUE));&
//获取frame的最上层面板为了设置其背景颜色(JPanel有设置透明的方法)
&JPanel jp=(JPanel)frame.getContentPane();&
jp.setOpaque(false); &//设置透明
//测试用的JPanel
JPanel panel=new&JPanel();&
panel.setOpaque(false); &//也要让他透明
panel.setLayout(null);
//为了使用按钮的定位
JButton button=new&JButton(&OK&);&
button.setSize(100, 20);&
button.setLocation(100, 50);&
panel.add(button);&
frame.add(panel);&
效果如图:
我们直接在最上层容器内重写paintComponent(Graphics g)方法在容器中画一张图片。(这种方法很直观,原理很简单)
&具体步骤:
&只需要在构造JPanel时重写paintComponent(Graphics g)就ok了。
&class&PanelTest&extends&JPanel{&
& ImageIcon&background&=&new&ImageIcon(&background.jpg&);
//加载图片
&Image&im=Toolkit.getDefaultToolkit().getImage(&background.jpg&);&
&int&h,w;&
&public&void&paintComponent(Graphics g) {&
g.drawImage(im, 0, 0,&null);&
只要了解了基本原理我们就可以更随意一点设计我们的风格了,我在这了抛砖引玉,希望对初学者有所帮助。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1009次
排名:千里之外7989人阅读
java(102)
终于成功实现了如何为jframe窗口设置背景图片了。下面是示例,请初学swring的朋友们参考学习!
import java.awt.FlowL
import javax.swing.ImageI
import javax.swing.JB
import javax.swing.JF
import javax.swing.JL
import javax.swing.JP
public class JFrameBackground {
private JFrame frame = new JFrame(&背景图片测试&);
private JPanel imageP
private ImageI
public static void main(String[] args) {
new JFrameBackground();
public JFrameBackground() {
background = new ImageIcon(&003.jpg&);// 背景图片
JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面
// 把标签的大小位置设置为图片刚好填充整个面板
label.setBounds(0, 0, background.getIconWidth(),
background.getIconHeight());
// 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
imagePanel = (JPanel) frame.getContentPane();
imagePanel.setOpaque(false);
// 内容窗格默认的布局管理器为BorderLayout
imagePanel.setLayout(new FlowLayout());
imagePanel.add(new JButton(&测试按钮&));
frame.getLayeredPane().setLayout(null);
// 把背景图片添加到分层窗格的最底层作为背景
frame.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(background.getIconWidth(), background.getIconHeight());
frame.setResizable(false);
frame.setVisible(true);
public&static&void&main&(String[]&args)&{&&&&&&&
JFrame&frame=new&JFrame(&背景图设置&);&&& &&&&
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&&&&&&&
ImageIcon&img&=&new&ImageIcon(&bg\\1.gif&);//这是背景图片&&&
JLabel&imgLabel&=&new&JLabel(img);//将背景图放在标签里。&&&&&
frame.getLayeredPane().add(imgLabel,&new&Integer(Integer.MIN_VALUE));//注意这里是关键,将背景标签添加到jfram的LayeredPane面板里。&&&
imgLabel.setBounds(0,0,img.getIconWidth(),&img.getIconHeight());//设置背景标签的位置&&&
Container&cp=frame.getContentPane();&&&
cp.setLayout(new&BorderLayout());&&&
JButton&but=new&JButton(&anniu&);//创建按钮&&
cp.add(but,&North&);//将按钮添加入窗口的内容面板&&&&&
((JPanel)cp).setOpaque(false);&//注意这里,将内容面板设为透明。这样LayeredPane面板中的背景才能显示出来。&&&&&
frame.setSize(500,300);&&&frame.setVisible(true);&&&&&&&&&&&&&&&&&&&&
通过为jframe设置背景图片,让我明白了以下的知识要点: &
(1)jframe窗口的组成部分,最底层是jrootpane面板。(这一点恐怕很多初学者都没有注意吧!) &
(2)jframe的组成如下: &jrootpane中包含glasspane和layeredpane两个面板。而layeredpane面板包含contentpane和jmenubar。(没想到吧contentpane是放在contentpane中的?) & & & & & & & & & & & & & &
(3)在jframe上添加组件,往往是添加在contentpane中。。但是在contentpane的下面还有两层面板,那就是layeredpane和jrootpane。 &
(4)任何一本关于java的书中都会介绍contentpane,却很少提到layeredpane和jrootpane,因此使得很多的初学者产生:jframe中只要一个contentpane的错误认识。 通过解决背景设置的问题,让我对jframe中容器的“层”结构,
更多参考:
& 从网上搜索了有关设置背景图片的文章,但是因为我每次设计窗口程序的时候,喜欢利用“Degsin”按钮,将所有的窗口进行布局后,在进行相关源代码的填写,因此,网页提供的答案是直接在主函数中编写,而我选择了在构造函数中编写,故有一定的不同。相关代码如下:
public static void main(String[] args) {
&&EventQueue.invokeLater(new Runnable() {
&&&public void run() {
&&&&&HAPPY frame = new HAPPY();
&&&&&//frame.setVisible(true);&&&&& 这行代码,可加可不加,并不会影响最终结果,但是在构造函数中一定要添加;
&&&&} catch (Exception e) {
&&&&&e.printStackTrace();
构造函数(关键代码):
JFrame frame=new JFrame(&\设\置\背\景\图\片 &);&&&
&&&& frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&&&
&&&& ImageIcon img = new ImageIcon(&src/images/1.jpg&);//这是背景图片&&&
&&&& JLabel imgLabel = new JLabel(img);//将背景图放在标签里。&&&
&&&& frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE));//注意这里是关键,将背景标签添加到jfram的&&&& LayeredPane面板里。&&&
&&&& imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight());//设置背景标签的位置&&&
&&&& Container cp=frame.getContentPane();&&&
&&&& cp.setLayout(null);&&&&&&//这里选择绝对布局管理器,对于边界布局管理器,放入控件后,无法显示背景图片;因为将整个面板都填充满了;
&&&& ((JPanel)cp).setOpaque(false); //这样就能显示出背景图片出来了。
剩下的就是在面板中添加相关的控件,添加语句可以用:
(1)frame.getContentPane().add(panel);&&&&&&& (2)cp.add(panel)&&&&&&&&&&&&
效果一样;
另一种方法则是直接为面板设置背景图片,源代码如下:
contentPane = new JPanel(){
&&&private static final long serialVersionUID=-3087637L;
&&&public void paint(Graphics g){
&&&&ImageIcon icon=new ImageIcon(&src/images/5.jpg&);
&&&&Image image=icon.getImage();
&&&&g.drawImage(image, 0, 0, null);
但在实验中发现,显示效果不如前一种方法,不知为何,面板上设置的标签文字显示不出来,所以,后一种方法虽然更简便,但似乎前一种方法效果更好!
第三种方法:
contentPane.setOpaque(false);
JLabel backgroundLabel = new JLabel(&&);
&&&&&&& ImageIcon background = new ImageIcon(BalloonMove.class.getResource(&/images/background.jpg&));
&&&&&&& backgroundLabel.setBounds(0, 0, background.getIconWidth(),background.getIconHeight());
&&&&&&& backgroundLabel.setIcon(background);
&&&&&&& getLayeredPane().add(backgroundLabel, new Integer(Integer.MIN_VALUE));
窗口中的标签,可以直接添加到contentPane面板中,很显然,最后一种方法显示效果很好,且代码简便。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8525849次
积分:64719
积分:64719
排名:第28名
原创:523篇
转载:966篇
评论:2044条
如果您认为本博客不错,读后觉得有收获,不妨打赏赞助我一下,让我有动力继续写出高质量的博客。
赠人玫瑰,手有余香。分享技术,传递快乐。
QQ交流群:
有心课堂会员,请加入VIP QQ交流群:
文章:28篇
阅读:78483
文章:69篇
阅读:335382

我要回帖

更多关于 jframe 的文章

 

随机推荐