Java 自定义窗体(标题栏、窗体背景)

时间:2022-05-12 09:13:30

感谢大佬:https://blog.csdn.net/ltx06/article/details/28996839

最近在书上看到这篇文章,觉得挺有意思。与大家分享一下,具体可以参见明日科技出版的《Java经典编程300例》。

默认情况下,我们用java设计的界面窗体是这样的:

Java 自定义窗体(标题栏、窗体背景)

默认的标题栏、最大化、最小化、关闭按钮、窗体边框。

如何自定义窗体达到如下效果呢?

Java 自定义窗体(标题栏、窗体背景)

大致说下代码要点:

  1. 设置窗体的Undecorated属性为true,阻止窗体采用本机系统修饰,这样窗体就没有标题栏和边框了。
  2. 设计背景面板类。BackgroundPanel extends JPanel。
  3. 窗体面板添加标题栏面板,位置在上方。
  4. 标题栏面板添加背景面板显示标题栏图片、标题栏面板添加面板用于放置最大化、最小化、关闭按钮。
  5. 窗体面板添加背景面板在中间。contentPane.add(mianPanel,BorderLayout.Center);
  6. 添加按钮响应、添加标题栏拖动代码。

代码:

首先是带背景图片面板类:

package cn.chengmaoning.customframe;      

import java.awt.Graphics;
import java.awt.Image; import javax.swing.JPanel; public class BackgroundPanel extends JPanel { /**
*
*/
private static final long serialVersionUID = -898997756345637309L;
private Image image; /**
* Constructor
*/
public BackgroundPanel() {
super();
setOpaque(false);
setLayout(null);
} /**
* @param image
* 要设置的 image
*/
public void setImage(Image image) {
this.image = image;
} @Override
protected void paintComponent(Graphics g) {
if (image != null) {
int width = getWidth();// 获取组件大小
int height = getHeight();
g.drawImage(image, 0, 0, width, height, this);// 绘制图片与组件大小相同
}
super.paintComponent(g);// 执行超类方法
} }

其次再是主类:

package cn.chengmaoning.customframe;     

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter; import javax.jws.Oneway;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton; public class ControlFormStatus extends JFrame { /**
*
*/
private static final long serialVersionUID = -2214759764324605473L;
private JPanel contentPane;
private Point pressedPoint; /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
EventQueue.invokeLater(new Runnable() { @Override
public void run() {
// TODO 自动生成的方法存根
try {
ControlFormStatus frame = new ControlFormStatus();
frame.setVisible(true);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
});
} /**
* Constructor
*/
public ControlFormStatus(){
setUndecorated(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(null);
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane); BackgroundPanel topPanel = new BackgroundPanel();
topPanel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e){
do_topPanel_mouseDragged(e);
}
});
topPanel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
// TODO 自动生成的方法存根
do_topPanel_mousePressed(e);
}
});
Image centerImage = new ImageIcon(getClass().getResource("frameTop.png")).getImage();
Dimension dimension = new Dimension(centerImage.getWidth(this), centerImage.getHeight(this));
topPanel.setPreferredSize(dimension);
topPanel.setImage(centerImage); contentPane.add(topPanel,BorderLayout.NORTH);
topPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5)); JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(60, 22));
panel.setOpaque(false);
topPanel.add(panel);
panel.setLayout(new GridLayout(1, 0, 0, 0)); JButton button = new JButton("");
button.setRolloverIcon(new ImageIcon(ControlFormStatus.class.getResource("minBH.jpg")));
button.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
do_button_actionPerformed(e);
}
});
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setIcon(new ImageIcon(ControlFormStatus.class.getResource("minB.jpg")));
panel.add(button); JToggleButton button_1 = new JToggleButton("");
button_1.addItemListener(new ItemListener() { @Override
public void itemStateChanged(ItemEvent e) {
// TODO 自动生成的方法存根
do_button_1_itemStateChanged(e);
}
});
button_1.setRolloverIcon(new ImageIcon(ControlFormStatus.class.getResource("maxBH.jpg")));
button_1.setRolloverSelectedIcon(new ImageIcon(ControlFormStatus.class.getResource("maxBH.jpg")));
button_1.setIcon(new ImageIcon(getClass().getResource("maxB.jpg")));
button_1.setContentAreaFilled(false);
button_1.setBorderPainted(false);
button_1.setFocusPainted(false);
panel.add(button_1); JButton button_2 = new JButton("");
button_2.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
do_button_2_actionPerformed(e);
}
});
button_2.setRolloverIcon(new ImageIcon(getClass().getResource("closeBH.jpg")));
button_2.setIcon(new ImageIcon(getClass().getResource("closeB.jpg")));
button_2.setFocusPainted(false);
button_2.setContentAreaFilled(false);
button_2.setBorderPainted(false);
panel.add(button_2); BackgroundPanel baclBackgroundPanel_1 = new BackgroundPanel();
Image topImage = new ImageIcon(getClass().getResource("frameCenter.png")).getImage();
baclBackgroundPanel_1.setImage(topImage);
contentPane.add(baclBackgroundPanel_1, BorderLayout.CENTER); } protected void do_button_2_actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
dispose();
} protected void do_button_1_itemStateChanged(ItemEvent e) {
// TODO 自动生成的方法存根
if (e.getStateChange() == ItemEvent.SELECTED) {
setExtendedState(MAXIMIZED_BOTH);
} else {
setExtendedState(NORMAL);
}
} protected void do_button_actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
setExtendedState(ICONIFIED);
} protected void do_topPanel_mousePressed(MouseEvent e) {
// TODO 自动生成的方法存根
pressedPoint = e.getPoint();
} protected void do_topPanel_mouseDragged(MouseEvent e) {
// TODO 自动生成的方法存根
Point point = e.getPoint();
Point locationPoint = getLocation(); int x = locationPoint.x + point.x - pressedPoint.x;
int y = locationPoint.y + point.y - pressedPoint.y; setLocation(x, y);
} }

代码中用到的图片如下:(我不知道有什么更好的方法可以把图片保存到这篇文章里,所以只有贴到这里了,试验的同学可以直接另存图片到本机,放置到与.java相同路径下即可)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)

Java 自定义窗体(标题栏、窗体背景)的更多相关文章

  1. WPF 之 自定义窗体标题栏

    在WPF中自定义窗体标题栏,首先需要将窗体的WindowStyle属性设置为None,隐藏掉WPF窗体的自带标题栏.然后可以在窗体内部自定义一个标题栏. 例如,标题栏如下: <WrapPanel ...

  2. WinForm拖动没有标题栏窗体的方法

    建立窗体的名称修改为:Form_HoverTree 文后附有源码下载. 主要代码: Point _HoverTreePosition; public Form_HoverTree() { Initia ...

  3. 【转】【C&num;】C&num;重绘windows窗体标题栏和边框

    摘要 windows桌面应用程序都有标准的标题栏和边框,大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如QQ, MSN,迅雷等聊天工具的样式则与传统的windows程序大不相同,其中迅雷 ...

  4. WPF修改窗体标题栏的颜色

    WPF程序通常情况下没办法修改窗体标题栏的样式,包括标题栏的背景颜色. 不过借助一个叫Fluent.Ribbon的第三方控件,貌似可以修改标题栏的背景颜色. 可以通过NuGet来安装这个控件:Inst ...

  5. C&num;之移动无标题栏窗体功能的实现&excl;&period;&period;&period;

    为实现移动无标题栏窗体的功能,我从网上寻找.整理了以下资料,以备不时之需: 该方法适用于有标题栏和无标题栏窗体,适用于窗体内控件,当然 Form 也不例外, 只须添加 MouseDown.MouseM ...

  6. Delphi组件开发-在窗体标题栏添加按钮(使用MakeObjectInstance&lpar;NewWndProc&rpar;,并处理好多消息)

    这是一个在窗体标题栏添加自定义按钮的组件(TTitleBarButton)开发实例,标题栏按钮组件TTitleBarButton以TComponent为直接继承对象,它是一个可以在窗体标题栏上显示按钮 ...

  7. C&num; 移动无标题栏窗体的几种方法

    第一种,手工移动. 该方法根据鼠标位置实现窗体的移动.网上有很多相关的例子,这里不再多讲. 第二种,调用系统API原理:是当鼠标左键按下时,让系统认为是在标题栏按下的.这里我们用到了winapi里的W ...

  8. C&num;自定义运行时窗体设计器Runtime FormDesigner

    写在前面:因为业务的需要,有时会使用到自定义运行时窗体设计器Runtime FormDesigner,实现的功能,就是IDE设计器的简化.设想一下,如果可以在程序运行时,再设计一个Form,然后编译代 ...

  9. C&num;实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法

    对于无标题栏窗体,也就是FormBorderStyle等于System.Windows.Forms.FormBorderStyle.None的窗体,点击任务栏图标的时候,是不能象标准窗体那样最小化或还 ...

随机推荐

  1. oracle中将自建用户下的所有表删除

    select 'drop table '||table_name||' ;' from user_tables;select 'drop sequence '||sequence_name||' ;' ...

  2. va&lowbar;list结构体

    http://*.com/questions/4958384/what-is-the-format-of-the-x86-64-va-list-structure 这是我在st ...

  3. &lbrack;手机取证&rsqb; CelleBrite UFED Touch系列使用视频

    CelleBrite UFED Touch系列产品使用指导视频 (持续更新中) 1. CelleBrite UFED Touch产品介绍

  4. Apple个人&lpar;Individual&rpar;开发者账号升级公司&lpar;Company&rpar;开发者账号

    1.拨打苹果针对中国区开发者的咨询服务热线:4006 701 855: 2.简单向对方(中文不太标准,但听懂没问题)说明意图后,会要求提供: (1)之前申请IDP时purchase form上的per ...

  5. 关于java 中文乱码问题 自己的一点解决方案

    早上做导出的时候,url拼接参数中文出现了乱码.查了半天.终于中午搞定了. 在web.xml中加了转码过滤器,tomcat的server.xml中也加入URIEncoding="UTF-8& ...

  6. dialogic d300语音卡驱动重装后启动报错问题解决方法

    dialogic d300 驱动重装后 dlstart  报错解决 问题描述:dlstart  后如下报错 [root@BJAPQ091 data]#dlstop Stopping Dialogic ...

  7. 在 ASP&period;NET MVC 3 中应用 KindEditor

    http://www.cnblogs.com/weicong/archive/2012/03/31/2427608.html 第一步 将 KindEditor 的源文件添加到项目中,建议放到 /Scr ...

  8. MySQL注入中load&lowbar;file&lpar;&rpar;函数的应用

    常用的一些Load_File()函数攻击手法:

  9. Java框架spring Boot学习笔记(三):Controller的使用

    Controller注解介绍 @Controller:处理http请求 @RestController: Spirng4之后新加的注解,其实是一个组合注解等同于@ResponseBody和@Contr ...

  10. spring eureka required a bean of type &&num;39&semi;com&period;netflix&period;discovery&period;DiscoveryClient&&num;39&semi; that could not be found&period;

    spring在集成第三方过程很容易出现类名相同,且基本作用相同的类.这样给初学者带来一定的困惑. 导致用错类而出现以下问题. required a bean of type 'com.netflix. ...