JFrame实现无边框 及 实现拖动和Button关闭功能

来源:互联网 发布:大专程序员 编辑:程序博客网 时间:2024/06/03 05:06

                                                           JFrame实现无边框 及 实现拖动和Button关闭功能

在用JavaSwing编程做GUI图形用户界面时,可能有这样的需求,就是不想要外面的那个默认边框,那么如何实现JFrame去边框,以及去边框后又会出现什么问题呢?

 

使用setUndecorated(true);去边框后

1JFrame就没有标题了,且不能拖动了,需要自己实现界面的鼠标拖事件。

2、没有最小化、最大化和关闭按钮,一般需要实现关闭功能,不然程序无法关闭。

3、只有在窗体不可显示时才调用此方法。也就是要在setVisible之前调用

 例子:

package com.ljheee.frame;

import java.awt.Image;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;


public class JFrameNoBorder extends JFrame{
 
 //背景图片bgImage
 private ImageIcon bgImage = new ImageIcon("src/images/0001.PNG");
 //用于处理拖动事件,表示鼠标按下时的坐标,相对于JFrame
 int xOld = 0;
 int yOld = 0;
   
 public JFrameNoBorder() {
  
  getContentPane().setLayout(null);
  this.setLocationRelativeTo(null);
  bgImage.setImageObserver(null);
  this.setSize(( bgImage).getIconWidth(),bgImage.getIconHeight());
  
  //处理拖动事件---去掉默认边框后,不能拖动了,具体实现如下
  this.addMouseListener(new MouseAdapter() {
  @Override
  public void mousePressed(MouseEvent e) {
    xOld = e.getX();//记录鼠标按下时的坐标
    yOld = e.getY();
   }
  });
  
    this.addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseDragged(MouseEvent e) {
    int xOnScreen = e.getXOnScreen();
    int yOnScreen = e.getYOnScreen();
    int xx = xOnScreen - xOld;
    int yy = yOnScreen - yOld;
    JFrameNoBorder.this.setLocation(xx, yy);//设置拖拽后,窗口的位置
    }
   });

   
    /**
     * JLayeredPane用于添加两个图层的,一个用于背景,一个用于界面
     * JLayeredPane 将该深度范围分成几个不同的层。将组件放入相应的层,这样更容易确保组件正确地重叠
     * 在调用 add 的过程中通过传递 int值,从而在 Component 上设置 layer 属性
     */
   JLayeredPane layeredPane = new JLayeredPane();
   layeredPane.setSize(bgImage.getIconWidth(), bgImage.getIconHeight());
   getContentPane().add(layeredPane);
  
   //背景图层Panel,充当容器---最底层
   JPanel bgPanel = new JPanel();
   bgPanel.setSize(bgImage.getIconWidth(),bgImage.getIconHeight());
   layeredPane.add(bgPanel);
  
   //背景图片,添加到背景图层Panel里面
   JLabel bgLabel = new JLabel(bgImage);
   bgPanel.add(bgLabel);
   
   //主界面,也就是背景上面的一层Panel,可用于添加控件
   JPanel mainPanel = new JPanel();
   mainPanel.setSize(200,200);
   mainPanel.setLayout(null);
   layeredPane.add(mainPanel);
   
   //关闭按钮
   JButton closeButton = new JButton();
   closeButton.setIcon(new ImageIcon("src/images/closebtn.png"));
   closeButton.setSize(30, 30);
   mainPanel.add(closeButton);
    
   closeButton.addActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
     System.exit(0);
     }
    });
   this.setUndecorated(true);
 }
  
 public static void main(String[] args) {
  JFrameNoBorder j = new JFrameNoBorder();
  j.setVisible(true);
 }

}

 

 

参阅

http://blog.csdn.net/qiantujava/article/details/10060847

 

0 0