专栏首页编程语言xuetangJava图形化界面电脑管家界面
原创

Java图形化界面电脑管家界面

学会JavaSwing构建程序界面后,小伙伴们最大的困惑可能是“为什么我们做出来的界面那么丑、不跟市面流行的程序界面一样呢?”

像这个界面,我们发现标题栏跟默认状态不一样,关闭按钮的样式也变了。实现的方法其实很简单,使用setUndecorated(true);取消窗体装饰,其他效果通过图片完成即可。下面的代码实现了无标题栏窗体,使用背景拉伸的技术为处于上部分的面板设置了背景图片;实现了关闭按钮的鼠标经过以及鼠标单击事件;实现了鼠标拖拽新标题栏移动整个窗体的功能。其他功能及特效大家可以自行实现。

Constants.java

/**

* @Description: 用来保存常量

* @author: 老九学堂·窖头

* @date: 2017年12月25日 下午2:47:31

* @version V1.0

* @Copyright: 2017 http://www.xuetang9.com Inc. All rights reserved.

*/

public class Constants {

/** 全局字体名称 */

public static String SysFontName = "宋体";

/** 登录窗体的宽 */

public static int Width_LoginFrame = 387;

/** 登录窗体的高 */

public static int Height_LoginFrame = 266;

}

LoginFrame.java

/**

* @Description: 登录界面

* @author: 老九学堂·窖头

* @date: 2017年12月25日 下午2:40:07

* @version V1.0

* @Copyright: 2017 http://www.xuetang9.com Inc. All rights reserved.

*/

public class LoginFrame extends JFrame{

private JPanel pnlTop = new TopPanel("images/sknin1.jpg");

private JPanel pnlMiddle = new JPanel();

private JPanel pnlBottom = new JPanel();

private JPanel contentPane = null;

private BorderLayout contentPaneLayout = null; //内容面板的边框布局

private Point mousePressedPoint; //点击pnlTop面板时记录下的鼠标坐标

public LoginFrame(){

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //关闭窗体时什么也不做

setTitle("登录电脑管家"); //设置窗体标题

setSize(Constants.Width_LoginFrame, Constants.Height_LoginFrame); //这里的窗体大小可以参考图片素材的大小(界面素材需复制到images文件夹下)

initComponents(); //调用自定义方法初始化窗体上的组件

setLocationRelativeTo(null); //设置窗体居中

setUndecorated(true); //设置窗体无装饰为真

}

private void initComponents() {

contentPane = new JPanel();

contentPaneLayout = new BorderLayout();

contentPane.setLayout(contentPaneLayout);

/********************** start of 设置pnlTop相关控件 *************************/

JLabel lblTitle = new JLabel(" 登录电脑管家");

lblTitle.setFont(new Font(Constants.SysFontName, Font.PLAIN, 14));

lblTitle.setForeground(Color.WHITE);

//网格包布局

GridBagLayout pnlTopLayout = new GridBagLayout();

pnlTop.setLayout(pnlTopLayout);

pnlTop.add(lblTitle);

JLabel lblClose = new JLabel();

lblClose.setIcon(new ImageIcon("images/close.png"));

pnlTop.add(lblClose);

//设置网格包布局的规则

GridBagConstraints grConstraints = new GridBagConstraints();

grConstraints.insets = new Insets(0, 0, 0,245);//设置四方向边距

pnlTopLayout.setConstraints(lblTitle, grConstraints);//为控件设置新规则

//越过布局设置控件的宽高

pnlTop.setPreferredSize(new Dimension(Constants.Width_LoginFrame, 30));

contentPane.add(pnlTop, BorderLayout.NORTH);

lblClose.addMouseListener(new MouseAdapter() {//关闭按钮图片替换

ImageIcon icon = new ImageIcon("images/close.png");

@Override

public void mouseEntered(MouseEvent e) {

lblClose.setIcon(null);

lblClose.setForeground(Color.RED);

lblClose.setText("X"); //没有其他图片素材,使用X字母模拟实现切换效果

lblClose.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));

}

@Override

public void mouseExited(MouseEvent e) {

lblClose.setIcon(icon);

}

@Override

public void mouseClicked(MouseEvent e) {

int result = JOptionPane.showConfirmDialog(null, "确认关闭吗?", "窗口关闭",JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);

if(result == 0) System.exit(0);

}

});

pnlTop.addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

//鼠标点击时先记录鼠标的坐标

mousePressedPoint = e.getPoint();

}

});

pnlTop.addMouseMotionListener(new MouseAdapter() {

@Override

public void mouseDragged(MouseEvent e) {

//获得窗体当前的坐标

Point p = getLocation();

//设置窗体坐标:当前坐标+鼠标移动后的当前坐标-鼠标原坐标 == 当前坐标+鼠标移动距离

setLocation((int)(p.getX() + e.getX() - mousePressedPoint.getX()), (int)(p.getY() + e.getY() - mousePressedPoint.getY()));

}

});

/********************** end of 设置pnlTop相关控件 *************************/

this.setContentPane(contentPane);

}

class TopPanel extends JPanel{//重写上部面板(实现了背景图片拉伸效果)

private ImageIcon background;

public TopPanel(String backImagePath) {

if(null == backImagePath) return;

background = new ImageIcon(backImagePath);

}

@Override

protected void paintComponent(Graphics g) {//重绘组件

if(background == null) return;

//拉伸图片

g.drawImage(background.getImage(), 0, 0, Constants.Width_LoginFrame, background.getIconHeight(), null);

}

}

public static void main(String[] args) {

new LoginFrame().setVisible(true);

}

}

更多干货笔记关注微信公众号 : 老九学堂

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java中的深复制和浅赋值

    深复制和浅复制也称为深拷贝和浅拷贝。简单的说就是创建一个和当前对象一模一样的对象。在日常编码的过程中使用的几率并不多,但在面试中却会被经常问到。

    老九学堂-小师弟
  • C语言命名规范

    C是一门朴素的语言,你使用的命名也应该这样。然而,当面对复杂情况时就有些棘手,给全局变量取一个描述性的名字是必要的。把一个全局函数叫做“foo”是一种目光短浅的...

    老九学堂-小师弟
  • C++复合类型之vector和array模板

    今天我们就给小伙伴们简单的介绍一下数组的替代品,vector和array,模板类vector类似于string类,也是一种动态数组。您可以在运行阶段的设置vec...

    老九学堂-小师弟
  • C# 使用OpenCV在一张图片里寻找人脸

    例程中用到一个库叫做emgucv,是opencv\的net封装 编译打包好的稳定版,在这:https://sourceforge.net/projects/em...

    zls365
  • 修改Springboot 2的默认Json解析器JackSon为FastJson

    我们在Controller中如果传递的参数为对象的话,此时我们传递过来的Json串是使用SpringBoot的默认解析器来进行解析的,但是JackSon的体验并...

    算法之名
  • Netty 之入门应用

    系列文章:http://www.jianshu.com/p/594441fb9c9e

    Yano_nankai
  • Netty|02 easy example

    1、博主使用的IDE是idea,很强大的开发工具 2、为了精简篇幅,博主把代码中需要导入包那一块去除了,大家在操作的时候需要手动导包 3、入门案例的每一行代码都...

    微笑的小小刀
  • WebApiThrottle限流框架使用手册

    蘑菇先生
  • Bug集锦-Spring Cloud Feign调用其它接口报错

    Spring Cloud Feign调用其它服务报错,错误提示如下:Failed to instantiate java.util.List: Specifie...

    小码农薛尧
  • 一文整懂 Java 中静态代码块 / 初始块 / 构造方法的执行顺序

    “ 相信,刷过面试题应该都碰到过很多题,关于类继承后 Java 中静态代码块 / 初始块 / 构造方法的执行顺序问题,每每记一下又忘了,那么,今天来用不多的时间...

    拾荒者的笔记

扫码关注云+社区

领取腾讯云代金券