您的位置:首页 > 编程语言 > Java开发

Java swing开发|Java实现窗体隐藏

2012-12-15 00:05 375 查看
// 先声明都是转载的
import java.awt.Point;
import java.awt.Rectangle;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class WindowSnapper extends ComponentAdapter {

    private boolean locked = false;
    private int snap_distance = 50;

    @Override
    public void componentMoved(ComponentEvent evt) {
        if (locked) {
            return;
        }
        Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
        int nx = evt.getComponent().getX();
        int ny = evt.getComponent().getY();
        // top
        if (ny < 0 + snap_distance) {
            ny = 0;
        }
        // left
        if (nx < 0 + snap_distance) {
            nx = 0;
        }
        // right
        if (nx > size.getWidth() - evt.getComponent().getWidth()
                - snap_distance) {
            nx = (int) size.getWidth() - evt.getComponent().getWidth();
        }
        // bottom
        if (ny > size.getHeight() - evt.getComponent().getHeight()
                - snap_distance) {
            ny = (int) size.getHeight() - evt.getComponent().getHeight();
        }

        // make sure we don't get into a recursive loop when the
        // set location generates more events
        locked = true;
        evt.getComponent().setLocation(nx, ny);
        locked = false;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Hack #33: Window Snapping");
        JLabel label = new JLabel("Move this window's titlebar to demonstrate screen edge snapping.");

        frame.getContentPane().add(label);
        frame.pack();

        frame.addComponentListener(new WindowSnapper());
        frame.setVisible(true);
    }
}


// 这是另外一个人的

// 该程序实现了,拖拽frame,遇到边缘则隐藏的功能。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.Timer;

public class MyFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private Rectangle rect;
    // 窗体离屏幕左边的距离
    private int left;
    // 窗体离屏幕右边的距离;
    private int right;
    // 屏幕的宽度;
    private int screenXX;
    // 窗体离屏幕顶部的距离
    private int top;
    // 窗体的宽
    private int width;
    // 窗体的高
    private int height;
    // 鼠标在窗体的位置
    private Point point;
    private Timer timer = new Timer(10, this);
    private int xx, yy;
    private boolean isDraging = false;
    private JFrame jFrame = new JFrame();

    public MyFrame() {
        super();
        timer.start();
        jFrame.setTitle("窗体在屏幕边缘隐藏演示");
        jFrame.setSize(400, 300);
        jFrame.setLocation(400, 300);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setAlwaysOnTop(true);
        jFrame.setUndecorated(true);
        jFrame.setVisible(true);
        moveFrame();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        left = jFrame.getLocationOnScreen().x;
        top = jFrame.getLocationOnScreen().y;
        width = jFrame.getWidth();
        height = jFrame.getHeight();
        screenXX = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
        right = screenXX - left - width;

        // 获取窗体的轮廓
        rect = new Rectangle(0, 0, width, height);
        // 获取鼠标在窗体的位置
        point = jFrame.getMousePosition();
        if (left < 0 && isPtInRect(rect, point)) {
            jFrame.setLocation(0, top); // 隐藏在左边,鼠标指到后显示窗体;
        } else if (left > -5 && left < 5 && !(isPtInRect(rect, point))) {
            jFrame.setLocation(left - width + 1, top); // 窗体移到左边便边缘隐藏到左边;
        } else if ((top < 0 && left < 0) && isPtInRect(rect, point)) {//窗体在左上角;
            jFrame.setLocation(0, 0);// 窗口隐藏了,鼠标指到他,就显示出来;
        } else if ((top > -5 && top < 5) && (left > -5 && left < 5)
                && !(isPtInRect(rect, point))) {
            // 当窗体的上边框与屏幕的顶端的距离小于5时 ,
            // 并且鼠标不再窗体上将窗体隐藏到屏幕的顶端
            jFrame.setLocation(left - width + 1, 1);
        } else if ((top < 0) && isPtInRect(rect, point)) {
            jFrame.setLocation(left, 0);// 窗口隐藏了,鼠标指到他,就显示出来;
        } else if (top > -5 && top < 5 && !(isPtInRect(rect, point))) {
            // 当窗体的上边框与屏幕的顶端的距离小于5时 ,
            // 并且鼠标不再窗体上将窗体隐藏到屏幕的顶端
            jFrame.setLocation(left, 1 - height);
        } else if (right < 0 && isPtInRect(rect, point)) {
            jFrame.setLocation(screenXX - width + 1, top);// 隐藏在右边,鼠标指到后显示;
        } else if (right > -5 && right < 5 && !(isPtInRect(rect, point))) {
            jFrame.setLocation(screenXX - 1, top); // 窗体移到屏幕右边边缘隐藏到右边;
        } else if (right < 0 && top < 0 && isPtInRect(rect, point)) {//窗体在右上角;
            jFrame.setLocation(screenXX - width + 1, 0);// 隐藏在右边,鼠标指到后显示;
        } else if ((right > -5 && right < 5) && (top > -5 && top < 5)
                && !(isPtInRect(rect, point))) {
            jFrame.setLocation(screenXX - 1, 1); // 窗体移到屏幕右边边缘隐藏到右边;
        }
    }

    public boolean isPtInRect(Rectangle rect, Point point) {
        if (rect != null && point != null) {
            int x0 = rect.x;
            int y0 = rect.y;
            int x1 = rect.width;
            int y1 = rect.height;
            int x = point.x;
            int y = point.y;
            return x >= x0 && x < x1 && y >= y0 && y < y1;
        }
        return false;
    }

    public void moveFrame() {
        jFrame.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                isDraging = true;
                xx = e.getX();
                yy = e.getY();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                isDraging = false;
            }
        });

        jFrame.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (isDraging) {
                    int left = jFrame.getLocation().x;
                    int top = jFrame.getLocation().y;
                    jFrame.setLocation(left + e.getX() - xx, top + e.getY()
                            - yy);
                    jFrame.repaint();
                }
            }
        });
    }

    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame();
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐