java自定义窗口_Java-创建一个自定义窗口,扁平化界面

本文介绍了如何在Java中自定义窗口样式,使其呈现扁平化界面。通过加载背景图片、去除窗口边框、设置拖动功能、调整按钮样式,以及处理面板透明度,成功创建了一个美观的自定义窗口。
摘要由CSDN通过智能技术生成

众所周知,Java的默认窗口使用的是系统默认样式,那么我们如何自己定义样式使其更好看呢?下面我就来分享一下如何自定义样式。

效果:25f0bd603f8e44a8b041e1ac0ca71a72.jpg

首先准备好我们的背景,按钮贴图:c2104e3147474eedbc8a0cf8f4d23454.jpg

8af518b41c5d496db9532687beed35fb.jpg

然后开始。

先创建两个图片对象,把图片资源文件加进去。

ImageIcon background = new ImageIcon("res\\bg1.png"); // 创建一个名为background的图片对象,把背景图片加进去

ImageIcon buttonc=new ImageIcon("res\\close-r.png");// 创建一个名为buttonc的图片对象,把按钮贴图加进去

可以看到我们使用的是相对路径,及相对我们软件导出后的jar文件路径。而在eclipse ide中,工程文件夹的bin文件夹就可以等效为我们导出的jar文件。

bd48e3b478b2478c8d929c8a01de3c5a.jpg

然后需要把图片加到我们窗口背景里,如下:

JFrame jf=new JFrame();

jf.setSize(400,235);

Toolkit kit=Toolkit.getDefaultToolkit();

Dimension sc=kit.getScreenSize();

jf.setLocation((int)(sc.width/2.7f),sc.height/3);

jf.setUndecorated(true);//窗口去边框

JLabel bl=new JLabel(background); // 把上面的图片对象加到一个名为bl的标签里

bl.setBounds(0,0,jf.getWidth(),jf.getHeight()); //设置标签大小

JPanel imagePanel=(JPanel)jf.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 ,使内容窗格透明后才能显示背景图片

imagePanel.setOpaque(false); // 把背景图片添加到分层窗格的最底层作为背景

jf.getLayeredPane().add(bl,new Integer(Integer.MIN_VALUE));

但发现我们的窗口无法拖动。现在就要加入一段代码实现拖动:

先在我们的类里面定义两个全局变量作为鼠标位置:

static int mouseAtX;

static int mouseAtY;

然后在主方法加入如下代码:

jf.addMouseListener(new MouseAdapter() { //设置窗口可拖动,添加监听器

public void mousePressed(MouseEvent e) { //获取点击鼠标时的坐标

mouseAtX=e.getPoint().x;

mouseAtY=e.getPoint().y;

}

});

jf.addMouseMotionListener(new MouseMotionAdapter() { //设置拖拽后,窗口的位置

public void mouseDragged(MouseEvent e) {

jf.setLocation(e.getXOnScreen()-mouseAtX,e.getYOnScreen()-mouseAtY);

}

});

窗口就做出来了。b5e427d529084c358636a2a69c3d026e.jpg

现在添加组件,按钮为了好看需要去按钮边框和设置按钮背景透明,并加入贴图,如下:

JButton close=new JButton(buttonc);//实例化按钮对象并加入上面的贴图

close.setContentAreaFilled(false);//设置按钮背景透明

close.setBorderPainted(false);//去掉按钮边框

创建标签文本:

JLabel frtitle=new JLabel("窗口标题");

通常使用JPanel面板对象加入,规整并布局组件,再加入到窗口中,如下:

JPanel p=new JPanel();//实例化JPanel对象

p.setLayout(null);

p.add(frtitle);

p.add(close);

jf.getContentPane().add(p);

但是运行后我们失望地发现:

29ff428d6f92471f834d0dd8dd87bafd.png

背景没了!

那是因为JPanel也有一个不透明的背景,加入到窗口后遮挡了背景,只需一行代码设置面板透明即可:

p.setOpaque(false); //面板设置为透明以显示背景

窗口就做完了!

47ec9ac32e044dc2bebbe34e67ca9739.jpg

完整代码:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

public class MainGUI{

static int mouseAtX;

static int mouseAtY;

public static void main(String[] args) throws Exception {

JFrame jf=new JFrame();

jf.setSize(400,235);

Toolkit kit=Toolkit.getDefaultToolkit();

Dimension sc=kit.getScreenSize();

jf.setLocation((int)(sc.width/2.7f),sc.height/3);

jf.setUndecorated(true);//窗口去边框

ImageIcon background=new ImageIcon("res\\bg1.png"); // 创建一个名为background的图片对象,把背景图片加进去

JLabel bl=new JLabel(background); // 把上面的图片对象加到一个名为bl的标签里

bl.setBounds(0,0,jf.getWidth(),jf.getHeight()); //设置标签大小

JPanel imagePanel=(JPanel)jf.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 ,使内容窗格透明后才能显示背景图片

imagePanel.setOpaque(false); // 把背景图片添加到分层窗格的最底层作为背景

jf.getLayeredPane().add(bl,new Integer(Integer.MIN_VALUE));

jf.addMouseListener(new MouseAdapter() { //设置窗口可拖动

public void mousePressed(MouseEvent e) { //获取点击鼠标时的坐标

mouseAtX = e.getPoint().x;

mouseAtY= e.getPoint().y;

}

});

jf.addMouseMotionListener(new MouseMotionAdapter() { //设置拖拽后,窗口的位置

public void mouseDragged(MouseEvent e) {

jf.setLocation(e.getXOnScreen()-mouseAtX,e.getYOnScreen()-mouseAtY);

}

});

ImageIcon buttonc=new ImageIcon("res\\close-r.png");// 创建一个名为buttonc的图片对象,把按钮贴图加进去

JButton close=new JButton(buttonc);//实例化按钮对象并加入贴图

close.setContentAreaFilled(false);//设置按钮背景透明

close.setBorderPainted(false);//去掉按钮边框

close.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.exit(0);

}

});

close.setBounds(353, 2, 28, 28);

JLabel frtitle=new JLabel("窗口标题");

frtitle.setBounds(10, 5, 85, 27);

JPanel p=new JPanel();//实例化JPanel对象

p.setOpaque(false); //面板设置为透明以显示背景

p.setLayout(null);

p.add(frtitle);

p.add(close);

jf.getContentPane().add(p);

jf.show();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值