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

相关文章
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
504 1
|
6月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
281 4
|
8月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
302 1
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
542 3
|
9月前
|
XML 人工智能 Java
java通过自定义TraceId实现简单的链路追踪
本文介绍了如何在Spring Boot项目中通过SLF4J的MDC实现日志上下文traceId追踪。内容涵盖依赖配置、拦截器实现、网关与服务间调用的traceId传递、多线程环境下的上下文同步,以及logback日志格式配置。适用于小型微服务架构的链路追踪,便于排查复杂调用场景中的问题。
470 0
|
12月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
450 3
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
14515 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
488 34
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
313 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下