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

相关文章
|
13天前
|
Java
如何在Java中实现自定义注解和处理器
如何在Java中实现自定义注解和处理器
|
4天前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
18 5
|
10天前
|
Java Spring
使用Java实现自定义注解的方法与技巧
使用Java实现自定义注解的方法与技巧
|
15天前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
【7月更文挑战第3天】TestNG教程展示了如何自定义日志记录。首先创建一个名为`TestLog`的测试类,包含3个测试方法,其中一个故意失败以展示日志。使用`Assert.assertTrue`和`Reporter.log`来记录信息。接着创建`CustomReporter`类,继承`TestListenerAdapter`,覆盖`onTestFailure`, `onTestSkipped`, 和 `onTestSuccess`,在这些方法中自定义日志输出。
27 6
|
16天前
|
存储 安全 Java
如何在Java中实现自定义数据结构:从头开始
如何在Java中实现自定义数据结构:从头开始
|
20天前
|
Java
Java自定义注解:优雅的代码标记
Java自定义注解:优雅的代码标记
18 1
|
27天前
|
Java 数据安全/隐私保护
利用Java图形化界面组件Swing写一个简易的登录界面
利用Java图形化界面组件Swing写一个简易的登录界面
28 1
|
29天前
|
前端开发 Java
【技术进阶】Java高手都在用的秘籍:自定义异常,让错误信息说话!
【6月更文挑战第19天】在Java中,自定义异常提升代码可读性和可维护性,提供针对特定错误的定制反馈。创建自定义异常涉及继承`Exception`类,如`CustomException`,并用它来抛出具有详细信息的错误。在实践中,可以为异常添加额外字段,如`DetailedException`的`errorCode`,以增强信息携带能力。使用自定义异常时,应明确目的、保持简洁、提供丰富信息并统一风格,使其成为高效错误处理的工具。
|
29天前
|
Java 程序员 开发者
【程序员必修课】那些年,我们踩过的Java坑:自定义异常,让你的代码不再“捉急”!
【6月更文挑战第19天】Java异常处理不仅是错误处理,更是程序健壮性的体现。自定义异常能提供更精确的错误信息,便于问题定位。通过继承`Exception`创建自定义异常类,如`NegativeValueException`,可使代码更优雅,降低维护难度。自定义异常还能携带额外信息,如错误代码,增强企业级应用的错误处理能力。善用自定义异常,提升代码质量和开发效率,是优秀编程实践的重要组成部分。
|
29天前
|
搜索推荐 Java 开发者
【实战指南】Java异常处理新高度:自定义异常,打造个性化的错误管理体系!
【6月更文挑战第19天】在Java中,自定义异常允许开发人员针对特定业务需求创建新的异常类型,增强代码可读性和维护性,特别是在大型项目中。它使错误处理更精确,避免通用异常的模糊性,提升程序稳定性。创建自定义异常需继承`Exception`或`RuntimeException`,提供有意义的构造函数,并注意序列化ID。使用时,通过`throw`抛出并在`try-catch`块中捕获。设计上,异常命名应明确,携带相关信息,避免过度使用,且保持一致性。自定义异常是构建健壮错误处理体系的关键。

相关实验场景

更多