java怎么给窗体或者面板设置背景?

网上科普有关“java怎么给窗体或者面板设置背景?”话题很是火热,小编也是针对java怎么给窗体或者面板设置背景?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临...

网上科普有关“java怎么给窗体或者面板设置背景?”话题很是火热,小编也是针对java怎么给窗体或者面板设置背景?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

1 利用标签组件来设置

标签本来是一种最简单的组件,为什么可以将它设置成为一个窗体的背景呢?首先还是要了解框架JFrame中的层次结构。JFrame中的层次分布及相对关系是:最底层是JRootPane,第二层是JlayerPane,最上层就是ContentPane,也正是我们常说的内容面板。所以一般我们拖放的控件就是在ContentPane层上。也就是说我们只需将背景放在JFrame的第二层是JlayerPane上,再把内容面板ContentPane设置为透明,则第二层JlayerPane上放置的即成为内容面板的背景了。具体代码如下:

JPanelpnlMain=new JPanel(); //创建面板pnlMain。

getContentPane().add(pnlMain); //将pnlMain设置为主面板。

Iconi=new ImageIcon("背景.jpg"); /*用源“背景.jpg”构造一个ImageIcon对象i,需要注意如果的路径使用的是相对路径,则文件必须放在类文件所在文件夹或项目的根文件夹中,否则的路径必须用绝对路径。*/

JLabellblLogo = new JLabel(i); //用指定的构造标签对象lb

this.getLayeredPane().add(lb, new Integer(Integer.MIN_VALUE));

//把标签放在第二层JlayerPane上。

lb.setBounds(0, 0,ii.getIconWidth(),i.getIconHeight());

//设置标签的尺寸,即背景图象的大小。

getConentPane().setOpaque(false); /*把内容面板设置为透明,这样整个框架的背景就不再是内容面板的背景色,而是第二层中标签的图像。*/

pnlMain.add(lb); //将标签添加到主面板pnlMain中。

用标签组件JLabel来设置窗体背景,其扩展性上比较差,且在标签上不能放置其他组件,比如:在放置一个JButton,整个布局背景图就错乱。导致这种现象是因为Java加载组件是有顺序的,作为背景的JLabel的代码一定要放在全部组件代码的最后,这样JLabel的背景才不会被其他组件遮住,从而使整个布局背景错乱。所以采用这种方式来设置窗体背景有很大的局限性。因此最好是采用以下方式来设置窗体背景。

2 通过JPanel面板来设置窗体背景

JPanel面板是Java中的容器之一。而Java中的容器是没有背景的属性的,它们只有背景颜色,如果需要在JPanel面板上设置窗体背景,就需要重写paintComponent(Graphics g)方法,即把所要设置的背景画上作为JPanel面板的背景。具体实现如下:

首先定义一个JPanel的子类BjPanel,由于JPanel的构造方法不能添加图像,因此在创建此子类的时候先用getImage载入一幅背景,在重写paintComponent(Graphics g)方法时,利用drawImage方法将其逐渐绘制到屏幕上,并将该面板添加到框架中,最后将该面板设置为透明。其代码如下:

import java.awt.*;

import javax.swing.*;

public class bkground

{

public static void main(String args[])

{

BjFramef=newBjFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setVisible(true);

}

}

class BjFrame extends JFrame

{

public BjFrame()

{

setSize(WTH,HHT);

BjPanel pl=new BjPanel();

Container contentPane=getContentPane();

contentPane.add(pl);

pl. setOpaque(true);

}

public static final int WTH=300;

public static final int HHT=200;

}

class BjPanel extends JPanel

{

Image im;

public BjPanel()

{

im=Toolkit.getDefaultToolkit().getImage("背景.jpg");//需要注意的是如果用相对路径载入,则文件必须放在类文件所在文件夹或项目的根文件夹中,否则必须用绝对路径。

}

public void paintComponent(Graphics g)

{

super.paintComponent(g);

int imWidth=image.getWidth(this);

Int imHeight=image.getHeight(this); //定义的宽度、高度

int FWidth=getWidth();

int FHeight=getHeight();//定义窗口的宽度、高度

int x=(FWidth-imWidth)/2;

int y=(FHeight-imHeight)/2;//计算的坐标,使显示在窗口正中间

g.drawImage(image,x,y,null);//绘制

}

}

java编的窗口最上方的标题栏高度是多少?

Swing界面设计中, 窗口经常是JFrame 类实现的,?

但是我们直接设置背景颜色jframe.setBackground(Color.RED), 却不会显示. 因为把背景色添加错了位置.

JFrame中 ,组件的位置其实也是默认添加到了内容面板里, 所以我们要设置窗口的背景色, 要设置的其实是内容面板的背景颜色

核心代码

getContentPane().setBackground(Color.RED);

完整的参考代码

import?java.awt.Color;

import?javax.swing.*;

public?class?JTFDemo?extends?JFrame?{

public?JTFDemo()?{

getContentPane().setBackground(Color.BLUE);//设置背景色为蓝色

//?窗口属性的设置

setTitle("Demo测试");//?标题

setSize(236,?200);//?窗口大小

setLocationRelativeTo(null);//?窗口居中

setDefaultCloseOperation(EXIT_ON_CLOSE);//?窗口点击关闭时,退出程序

setVisible(true);//?窗口可见

}

public?static?void?main(String[]?args)?{

new?JTFDemo();

}

}

java 点击按纽改变背景颜色

是的,最外面的window的大小是包括标题栏在内的,而且标题栏是native修饰的,高度不定。(windows下和linux下不同,windows xp和2000下都不同)

计算内置子组件的位置不要用window作为相对坐标的参考系,用contentpane,就是Container.getContentPane()得到的那个,对于最外层window来说,这个就是剥掉外层修饰可以放子组件的最大范围了,就是最高不能高过contentpane的y,最左左不过contentpane的x。

补充:

由于对于一定的native的修饰,比如标题栏的高度之类是固定的,所以最外层window的size定下来后,contentpane理论上也是固定下来的。但是contentpane其实作为window的一个子组件,其size的计算不是在构造时候完成的,也就是下面这段code里得到的contentpane的size还是(0,0)

JFrame aFrame = new JFrame();

aFrame.setSize(100, 100);

Container contentPane = aFrame.getContentPane();

两种解决方法:

1 最常用的方法布局时利用各种现成的LayoutManager,而不推荐自己去从头写代码来计算内部组件的大小。(SUN的一些现成的一些LayoutManager已经基本可以满足要求,还有一些第三方的LayoutManager可以做进一步补充,自己也可以在其基础上重载定制,但实用中几乎没有必要)。这样只要告诉LayoutManager各个内部组件相对的位置和占有的大小比例关系即可。

2 非要自己来计算确切的位置大小也不是不可以,但除非所有组件的大小都由你来确定,此外一般不在构造的时候确定,原因就在于一开始的问题,window大小确定后,默认布局计算算法是lazy的,这是contentPane的大小还是0,直到必须计算的时候才确定。所以要确保自己写的计算位置和大小的代码也要在parent的布局计算完成后才能调用。比如计算contentPane里面子组件位置代码可以让其被contentPane的doLayout()回调。当然你一般不想重载contentPane,那么就在其里面直接套一层JPanel好了,重载该JPanel的doLayout(). 这种方法不推荐,不如把算法放在LayoutManager更能使得逻辑耦合度降低。

针对补充的再补充:方法一就是用LayoutManager,方法二就是对某个container整个跳过或在LayoutManager调整之后再进行附加调整,通过重载Container.doLayout()在该方法内直接通过计算setBounds。

关于"针对补充的再补充"的再三补充:重载JDK Container里的doLayout(),在该函数内,可以完全用自己的计算代码,也可以调用过super之后再用自己的算法调整,super就是调用默认LayoutManager(设成null就不动作)。所以super之后(不能在之前)的定制调整会是能够覆盖默认布局效果的。在Container里调整的是子componet。

不明白为何不用方法一中逻辑清晰的方法,非要折腾这个呢?

分析题目:

一 分析布局: 题目明确的指出了按钮的位置和大小 ,那么说明需要使用的布局是空布局(绝对布局) , 而JFrame窗口的内容面板默认布局是边界布局(BorderLayout),所以需要设置一下

setLayout(null);//设置为绝对布局

二了解颜色. Color 可以通过红,绿,蓝 三原色, 不同的搭配, 形成不同的颜色.

每个原色的取值范围是0~255, 比如红色的rgb值就是r=255,g=0,b=0

胡萝卜色 r=237,g=145,b=33

三添加颜色 ,java给JFrame添加颜色,比较特殊. 必须添加到内容面板上,才能正常显示(因为JFrame分了好多层)

getContentPane().setBackground(new?Color(r,g,b));//设置窗口的面板背景色

四 事件处理分析: 点击按钮,会触发ActionEvent 事件,这个事件会被ActionListener 接收器接收到, 只需要重写ActionListener 里的actionPerformed 方法, 即可实现点击按钮后,做某件事

五 具体参考代码

import?java.awt.*;

import?java.awt.event.*;

import?javax.swing.*;

//?本类继承JFrame,实现了ActionListener接口

public?class?MyFrame?extends?JFrame?implements?ActionListener{

int?r?=?90;

int?g?=?15;

int?b?=?195;

public?MyFrame()?{

//组件的初始化

JButton?jbRed?=?new?JButton("red");

jbRed.setLocation(20,?80);//按钮位置

jbRed.setSize(80,?40);//按钮大小

jbRed.addActionListener(this);//添加点击按钮后的事件响应?,因为本类实现了ActionListener接口,所以可以传入参数this

JButton?jbGreen?=?new?JButton("green");

jbGreen.setLocation(120,?80);

jbGreen.setSize(80,?40);

jbGreen.addActionListener(this);

JButton?jbBlue?=?new?JButton("blue");

jbBlue.setLocation(220,?80);

jbBlue.setSize(80,?40);

jbBlue.addActionListener(this);

//添加组件到窗口

add(jbRed);

add(jbGreen);

add(jbBlue);

//窗口的设置

setLayout(null);//因为每一个按钮都设置了位置和大小,?那么应该把窗口设置为空布局,?那么位置和大小才能有效

setTitle("窗口标题");

getContentPane().setBackground(new?Color(r,g,b));//设置窗口的面板背景色

setLocation(220,?160);//?窗口位置

setSize(320,?240);//?窗口大小

//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭按钮时,结束程序

//下面也可以实现,点击关闭按钮时,?结束程序

addWindowListener(new?WindowAdapter()?{

@Override

public?void?windowClosing(WindowEvent?e)?{//点击关闭按钮会触发这个事件,调用这个方法

System.out.println("通过WindowListener实现关闭");

System.exit(0);//退出

}

});

}

public?void?actionPerformed(ActionEvent?e)?{

String?cmd=e.getActionCommand();

//通过ActionCommand?来判断是哪一个按钮被点击了

if("red".equals(cmd))?{//如果是红色按钮被点击了,那么红色+10

r+=10;

if(r>255)?{//如果red大于255?,可以设置为0?,也可以设置为255,一直锁定为255?也可设置为初始的90,这里题目这里没有要求

r=90;

}

}else?if("green".equals(cmd))?{

g+=10;

if(g>255)?{

g=15;

}

}else?if("blue".equals(cmd)){

b+=10;

if(b>255)?{

b=195;

}

}

this.getContentPane().setBackground(new?Color(r,g,b));

//System.out.println(this.getContentPane().getBackground());

}

public?static?void?main(String[]?args)?{

EventQueue.invokeLater(new?Runnable()?{

public?void?run()?{

new?MyFrame().setVisible(true);//启动窗口并设置可见

}

});

}

}

关于“java怎么给窗体或者面板设置背景?”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[小霜]投稿,不代表新盛号立场,如若转载,请注明出处:https://liuxinsheng.com/cshi/202503-12460.html

(319)

文章推荐

  • 为物理初学者推荐科普书

    网上科普有关“为物理初学者推荐科普书”话题很是火热,小编也是针对为物理初学者推荐科普书寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。《时间简史》被很多人用来入门,因为裏面几乎没有公式;另外《上帝掷骰子吗》也是一本很好的科普作品,如果你的孩子喜欢量子方面的话会

    2025年01月13日
    324
  • 寻求古玩书籍

    网上科普有关“寻求古玩书籍”话题很是火热,小编也是针对寻求古玩书籍寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。古玩是一个博大精深的领域,建议你在看书的同时也要多去古玩市场多看多问,将实物与书籍一同进修,才能更好地学习古玩知识。闲时还可以多逛一些古玩网站,例

    2025年01月14日
    314
  • 景点打卡风格有哪些 景点打卡有什么风格

    网上科普有关“景点打卡风格有哪些景点打卡有什么风格”话题很是火热,小编也是针对景点打卡风格有哪些景点打卡有什么风格寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1、奇特自然景观打卡。很多自然类景区本身因为雄、美、秀、险、奇、特等特点,景观本身就成为了打卡

    2025年01月18日
    364
  • 珍爱生命牢记安全手抄报

    网上科普有关“珍爱生命牢记安全手抄报”话题很是火热,小编也是针对珍爱生命牢记安全手抄报寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。珍爱生命牢记安全警句1、安全是最重要的,拥有安全,才能拥有生命。从此以后,我每天每时每刻都注意安全。2、上帝是公平的也是吝啬的

    2025年01月25日
    344
  • 光明房卡哪有~房卡获取方法

    在探讨“光明房卡”这一话题时,我们首先需要明确的是,房卡通常与住宿服务相关联,是酒店、宾馆或民宿等提供住宿服务的场所给予客人的一种凭证,用于开启房门,确保客人住宿期间的安全与便利。而“光明”一词,在中文语境中常带有积极、正面的含义,可能暗示着这种房卡具有某种特殊优势或优质服务。然而,在现实中,直接询

    2025年01月20日
    55
  • 开心神牛房卡低价”详细房卡怎么购买教程推荐一款“

    在当今数字化快速发展的时代,网络游戏已成为许多人休闲娱乐的首选方式之一。随之而来的,是游戏内虚拟物品交易的兴起,这其中便包括了各类游戏房卡。提及“开心神牛房卡低价”这一现象,我们不得不深入探讨其背后的原因、影响以及玩家应持有的理性态度。“开心神牛”作为一款颇受欢迎的网络游戏,其独特的玩法和丰富的

    2025年01月20日
    48
  • 上海至灵溪火车时刻表

    网上科普有关“上海至灵溪火车时刻表”话题很是火热,小编也是针对上海至灵溪火车时刻表寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。车次出发站开车时间到达站到达时间用时硬座软座G7501上海虹桥07:00苍南11:344小时34分242.5355.5D379上海

    2025年02月20日
    340
  • 高仿女士包包品牌前十名,特推这8个购买渠道

    在时尚界,高仿女士包包以其精湛的工艺和与正品极为相似的外观,受到了一部分消费者的青睐。以下是当前市场上备受关注的高仿女士包包品牌前十名,它们各自拥有独特的魅力和特色。路易威登(LouisVuitton):作为享誉全球的奢侈品牌,路易威登的包包以其经典的老花图案和耐用的材质而闻名。高仿路易威登包

    2025年02月15日
    41
  • 高仿圣罗兰圆饼包尺寸怎么样?收藏这10个渠道!

    高仿圣罗兰圆饼包作为时尚界备受瞩目的复刻单品,其尺寸一直是消费者关注的焦点。圣罗兰圆饼包以其独特的设计和实用的功能,成为了众多时尚爱好者的心头好。而对于高仿版本,了解其尺寸不仅能帮助消费者更好地判断真伪,还能确保购买到的包包能够满足个人的使用需求。圣罗兰圆饼包的原始设计尺寸通常为17厘米×17厘

    2025年02月15日
    37
  • 橱柜拉篮尺寸

    网上科普有关“橱柜拉篮尺寸”话题很是火热,小编也是针对橱柜拉篮尺寸寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。看橱柜的拉篮尺寸,首先要分碗碟拉篮和调味品篮两种,两种拉篮的规格差别很大。常规的碗碟拉篮、平篮,标准尺寸分600、700、800、900毫米这几个

    2025年03月04日
    338

发表回复

本站作者后才能评论

评论列表(4条)

  • 小霜
    小霜 2025年03月04日

    我是新盛号的签约作者“小霜”!

  • 小霜
    小霜 2025年03月04日

    希望本篇文章《java怎么给窗体或者面板设置背景?》能对你有所帮助!

  • 小霜
    小霜 2025年03月04日

    本站[新盛号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育

  • 小霜
    小霜 2025年03月04日

    本文概览:网上科普有关“java怎么给窗体或者面板设置背景?”话题很是火热,小编也是针对java怎么给窗体或者面板设置背景?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临...

    联系我们

    邮件:新盛号@sina.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们