网上科普有关“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
评论列表(4条)
我是新盛号的签约作者“小霜”!
希望本篇文章《java怎么给窗体或者面板设置背景?》能对你有所帮助!
本站[新盛号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育
本文概览:网上科普有关“java怎么给窗体或者面板设置背景?”话题很是火热,小编也是针对java怎么给窗体或者面板设置背景?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临...