Thursday, 21-11-2024, 2:51 PM
AFgame                                               

Chi sẻ kiến thức lập trình - Các demo và ứng dụng mở


Welcome Guest
Menu
Demo - HTML Hack [3]
Java - Swing [5]
Java - 2D Graphics [1]
Java - IO [3]
Java - Audio [1]
Java - Lập trình mạng [2]
Java - Trí tuệ nhân tạo [7]
Java - Lập Trình Nâng Cao [5]
Java - BT Lập trình mạng [6]
Java - Common [2]
C# [1]
Android [15]
Database [1]
Jsp/Servlet [5]
Application [1]
Tài liệu [3]
Thành viên đăng bài [0]
Nơi dành cho thành viên đăng các bài viết hoàn chỉnh hoặc các câu hỏi
Search
Statistics

Total online: 1
Guests: 1
Users: 0
TransparentBackground (Màn hình Jframe trong suốt)
08-05-2012, 7:35 PM

Download: http://adf.ly/7390380/transparentbackground

Jframe trong suốt như hình bên dưới:


Kỹ thuật ở đây là chụp ảnh màn hình vẽ (paint) vào component.
Đầu tiên tạo 1 lớp TransparentBackground extends JComponent{

private Image background;
Tiếp theo là phương thức updateBackground() dùng để chụp ảnh màn hình
public final void updateBackground() {
        try {
            Robot rbt = new Robot();
            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension dim = tk.getScreenSize();
            background = rbt.createScreenCapture(
                    new Rectangle(0, 0, (int) dim.getWidth(),
                    (int) dim.getHeight()));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


Một phương thức quan trọng là Override lại paintComponent(Graphics g). Điều này có ý nghĩa là vẽ lại background của component bằng ảnh nền đã chụp bằng phương thức updateBackground() ở trên.
 @Override
    public void paintComponent(Graphics g) {
        Point pos = this.getLocationOnScreen();
        Point offset = new Point(-pos.x, -pos.y);
        g.drawImage(background, offset.x, offset.y, null);
    }


Với hai phương thức trên thì có vẻ như component của chúng ta đã được trong suốt nhờ ảnh nền trùng với ảnh nền của màn hình.
Tuy nhiên vấn đề khi component di chuyển hoặc thay đổi kích thước thì component cần được cập nhật lại ảnh nền (
background )
Để làm được như vậy đối tượng TransparentBackground cần implements Runnable, WindowFocusListener, ComponentListener.

Mỗi khi component được resize hoặc di chuyển,.. thì hai phương thức dưới đây sẽ được gọi để cập nhật lại ảnh nền của components
 private long lastupdate = 0;
 public boolean refreshRequested = true;
public void run() {
        try {
            while (true) {
                Thread.sleep(250);
                long now = new Date().getTime();
                if (refreshRequested
                        && ((now - lastupdate) > 1000)) {
                    if (frame.isVisible()) {
                        Point location = frame.getLocation();
                        frame.hide();
                        updateBackground();
                        frame.show();
                        frame.setLocation(location);
                        refresh();
                    }
                    lastupdate = now;
                    refreshRequested = false;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void refresh() {
        if (frame.isVisible()) {
            repaint();
            refreshRequested = true;
            lastupdate = new Date().getTime();
        }
    }

Category: Java - Swing | Added by: as_fancy
Views: 3149 | Rating: 5.0/1
Total comments: 0
Giới Thiệu
Nghe Radio Zing
- Nhiều kênh
- Thêm kênh tùy thích
- Hẹn giờ tắt



Hát karaoke arirang
- Tìm kiếm nhanh chóng
- Hát thoải mái
- Nhạc beat Arirang chính hãng

Copyright AFgame © 2024
Trường ĐH Nông Lâm TP.HCM
Create a free website with uCoz