再次提问Jframe窗体的背景图和JPanel背景图的设置方法

hinavy 2005-07-25 05:06:58
我想问两个问题,一是JFrame的背景图设置方法,二是JPanel背景图设置方法

中午的时候提问窗体的背景图设置方法,有一个朋友给的方法是:
用到了层的概念。


bgLable.setIcon(backgroundIcon);
getContentPane().add(bgLabel,-1); // 在最底层加一个带背景图的JLabel
getContentPane().add(yourContentPanel,0); // 在顶层添加你的组件

如果添加的组件是JPanel,要把JPanel设置为透明的。panel.setOpaque(false);


经实际应用,好像要与GridBagLayout配合使用,否则背景图是无法出来的,不知道是我的代码有问题,还是这个方法行不通呢?

另外,我还想知道JPanel背景图的设置方法,在网上找了N久关于背景图的资料,都找不到相关的。。。汗了。。。


兄弟姐妹们,如果你们知道,请一定来帮我啊
如果你不知道,也请你帮我顶起这个问题。。。。
谢谢
...全文
1750 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fire1_0 2005-07-27
  • 打赏
  • 举报
回复
Content.setLayout(null)

gtlang78 2005-07-27
  • 打赏
  • 举报
回复
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BackgroundFrame extends JFrame {
private Image bgImg = null;

public BackgroundFrame(String title, Image backgroundImg)
{
super(title);
this.bgImg = backgroundImg;

JPanel contentPane = new JPanel(new BorderLayout()) {

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

g.drawImage(bgImg, 0, 0, getWidth(), getHeight(), this);
}
};
getRootPane().setContentPane(contentPane);
}

public static void main(String[] args) throws IOException
{
Image bgImg = ImageIO.read(BackgroundFrame.class.getResource("menubg.png"));

JFrame f = new BackgroundFrame("BGTest", bgImg);
f.getContentPane().setLayout(new FlowLayout());
f.getContentPane().add(new JButton("Test"), BorderLayout.CENTER);
f.setSize(400, 400);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
fire1_0 2005-07-26
  • 打赏
  • 举报
回复
newFrame.getLayeredPane().add(new PicPanel(),new Integer(Integer.MIN_VALUE));

你用到了JLayeredPane,虽然你把LayeredPane的设置为最底层,但是注意JFrame的ContentPane才是真正的最底层,LayeredPane是不可能被设置成比ContentPane低的,我试过。

我给你的思路是将所有组件都加在ContentPane上,但是用ContentPane的 Z order来决定层次关系。

getContentPane.add(PicPanel,-1)
getContentPane.add(LoginPanel ,0)

这样就能搞定。

如果你一定要用LayeredPane的话,就分别用两个LayeredPane,如层30,50,不要把东西加到ContentPane.
hinavy 2005-07-26
  • 打赏
  • 举报
回复
原代码如下:为什么不能显示背景图呢?


import java.awt.*;
import javax.swing.*;

public class MainFrame
{
public static void main(String[] args)
{
MFrame newFrame = new MFrame();
newFrame.getLayeredPane().setLayout(null);
newFrame.getLayeredPane().add(new PicPanel(),new Integer(Integer.MIN_VALUE));
newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);
newFrame.show();
newFrame.setVisible(true);
}
}

class MFrame extends JFrame
{
private JPanel Content;
public MFrame()
{
Content = (JPanel)getContentPane();

setTitle("明日之星");
setBounds(100,100,300,200);
//setResizable(false);
//add(new PicPanel());
Content.setOpaque(false); //设内容窗格为透明。。
Content.setLayout(new FlowLayout());
Content.add(new LoginPanel());
Content.add(new JButton("确认"));
}
}

class PicPanel extends JPanel
{
public PicPanel()
{
//把图片显示在标签里。。。
JLabel picLabel = new JLabel();
picLabel.setIcon(new ImageIcon("banner.gif"));
picLabel.setBounds(0,0,300,200);
setOpaque(false);
add(picLabel);
}
}

class LoginPanel extends JPanel
{
public LoginPanel()
{
JLabel loginLabel = new JLabel();
loginLabel.setText("用户名:");
//loginLabel.setBounds(0,0,300,200);
add(loginLabel);
}
}
hinavy 2005-07-26
  • 打赏
  • 举报
回复
起来。。。。
hinavy 2005-07-26
  • 打赏
  • 举报
回复
按你给的思路,我把代码改成如下:可是运行出来的显示是JLabel和JButton在上面,图片挤到下面去了,而不是作为背景。。不知道下面的代码哪儿还有没设置好的。。。

import java.awt.*;
import javax.swing.*;

public class MainFrame
{
public static void main(String[] args)
{
MFrame newFrame = new MFrame();
newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);
newFrame.show();
newFrame.setVisible(true);
}
}

class MFrame extends JFrame
{
private JPanel Content;
public MFrame()
{
Content = (JPanel)getContentPane();

setTitle("财务之星");
setBounds(100,100,300,200);
//setResizable(false);
Content.setOpaque(false); //设内容窗格为透明。。
Content.setLayout(new FlowLayout());

Content.add(new PicPanel(),-1);
Content.add(new LoginPanel(),0);
Content.add(new JButton("确认"),0);

}
}

class PicPanel extends JPanel
{
public PicPanel()
{
//把图片显示在标签里。。。
JLabel picLabel = new JLabel();
picLabel.setIcon(new ImageIcon("pic.jpg"));
picLabel.setBounds(0,0,300,200);
setOpaque(false);
add(picLabel);
}
}

class LoginPanel extends JPanel
{
public LoginPanel()
{
JLabel loginLabel = new JLabel();
loginLabel.setText("用户名:");
//loginLabel.setBounds(0,0,300,200);
add(loginLabel);
}
}
hinavy 2005-07-25
  • 打赏
  • 举报
回复
To:fire1_0(Steven)
你藏私啊,少一句代码给我,呵,我在网上也找到了,呵,试了一下确实可以,getLayeredPane().setLayout(null);这句是什么意思?getLayeredPane()是取得分层面板,内容窗格还可以分层的吗?可以分几层呢?
fire1_0 2005-07-25
  • 打赏
  • 举报
回复
hinavy (风中的那滴血)

我给你的那个方法是没问题的,我做过一个Japplet的例子,代码是从我的程序里拷出来的。

需要注意的是,必须 getContentPane().setLayout(null)

用坐标和尺寸控制,让背景的Jlabel和JFrame的尺寸一样大,就可以了。

62,614

社区成员

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

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