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

简介: Java-创建一个自定义窗口,扁平化界面

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

效果:

网络异常,图片无法展示
|

先新建一个窗口实例并设定基本属性,需要将窗口去边框处理:

JFrameframe=newJFrame();
frame.setSize(400, 235);
// 窗口居中DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((screenSize.width-frame.getWidth()) /2, (screenSize.height-frame.getHeight()) /2);
frame.setUndecorated(true); // 窗口去边框

然后通过下列代码实现将任意图片作为窗口背景:

JLabelbackgroundLabel=newJLabel(newImageIcon("res\\bg1.png")); // 把一个ImageIcon对象加到一个名JLabel实例中里backgroundLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight()); // 设置标签大小((JPanel) frame.getContentPane()).setOpaque(false); // 将窗口容器设置为透明以显示背景frame.getLayeredPane().add(backgroundLabel, Integer.valueOf(Integer.MIN_VALUE)); // 将上述图片JLabel实例加入到窗体最底层作为背景

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

网络异常,图片无法展示
|

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

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

privateintmouseAtX;
privateintmouseAtY;

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

jf.addMouseListener(newMouseAdapter() { // 设置窗口可拖动,添加监听器publicvoidmousePressed(MouseEvente) { // 获取点击鼠标时的坐标mouseAtX=e.getPoint().x;
mouseAtY=e.getPoint().y;
    }
});
jf.addMouseMotionListener(newMouseMotionAdapter() { // 设置拖拽后,窗口的位置publicvoidmouseDragged(MouseEvente) {
jf.setLocation(e.getXOnScreen() -mouseAtX, e.getYOnScreen() -mouseAtY);
    }
});

窗口就做出来了。

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

JButtonclose=newJButton(buttonc);       //实例化按钮对象并加入上面的贴图   close.setContentAreaFilled(false);      //设置按钮背景透明close.setBorderPainted(false);      //去掉按钮边框

创建标签文本:

JLabelfrtitle=newJLabel("窗口标题");

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

JPanelp=newJPanel();        //实例化JPanel对象p.setLayout(null);
p.add(frtitle);
p.add(close);
jf.getContentPane().add(p);

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

网络异常,图片无法展示
|

背景没了!

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

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

窗口就做完了!

网络异常,图片无法展示
|

最后我写了两个方法可以用于设定JFrame和JDialog的背景图:

/*** 设定JFrame窗口的背景图片* * @param frame 待设定的窗口* @param image 背景图片*/publicstaticvoidsetFrameBackground(JFrameframe, ImageIconimage) {
JLabelbackgroundLabel=newJLabel(image);
backgroundLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
    ((JPanel) frame.getContentPane()).setOpaque(false);
frame.getLayeredPane().add(backgroundLabel, Integer.valueOf(Integer.MIN_VALUE));
}
/*** 设置JDialog对话窗的背景图片* * @param dialog 待设定对话窗* @param image  背景图片*/publicstaticvoidsetDialogBackground(JDialogdialog, ImageIconimage) {
JLabelbackgroundLabel=newJLabel(image);
backgroundLabel.setBounds(0, 0, dialog.getWidth(), dialog.getHeight());
    ((JPanel) dialog.getContentPane()).setOpaque(false);
dialog.getLayeredPane().add(backgroundLabel, Integer.valueOf(Integer.MIN_VALUE));
}

传入窗口实例和ImageIcon实例即可。ImageIcon实例即为图片对象,可以用路径形式创建也可以用URL实例创建:

ImageIconimage=newImageIcon("res\\bg1.png"); // 以当前路径下res\\bg1.png为图片创建ImageIcon对象URLimageUrl=Main.class.getResource("/res/bg1.png"); // 获取jar包中的根目录下的res/bg1.png作为图片url,Main为我当前的类名ImageIconimage=newImageIcon(imageUrl); // 以url构建图片对象

这用于两种不同情况,前者是图片资源在jar包外部,后者是在jar包内部。

相关文章
|
1月前
|
Java Spring 容器
【Java】Spring如何扫描自定义的注解?
【Java】Spring如何扫描自定义的注解?
35 0
|
9天前
|
Java 测试技术 定位技术
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。
37 0
|
13天前
|
Java
Java配置大揭秘:读取自定义配置文件的绝佳指南
Java配置大揭秘:读取自定义配置文件的绝佳指南
16 0
Java配置大揭秘:读取自定义配置文件的绝佳指南
|
17天前
|
NoSQL Java Redis
Java自定义线程池的使用
Java自定义线程池的使用
|
1月前
|
Java
java 自定义注解 实现限流
java 自定义注解 实现限流
10 1
|
1月前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
44 0
|
2月前
|
Java
[Java]自定义注解
[Java]自定义注解
43 0
|
3月前
|
Java Maven
java使用apache-commons-lang3生成随机字符串(可自定义规则、RandomUtils
java使用apache-commons-lang3生成随机字符串(可自定义规则、RandomUtils
71 0
|
3月前
|
Java
用java写一个自定义异常
用java写一个自定义异常
16 1
|
3月前
|
Java 编译器
【Java】异常操作及自定义异常
【Java】异常操作及自定义异常
31 2