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包内部。

相关文章
|
2天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
2天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
1月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
45 3
|
3月前
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
|
18天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
40 14
|
19天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
70 8
|
15天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
23 4
|
25天前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
57 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
41 3