亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swing 破局:打造半透明窗口

2019-11-18 11:55:21
字體:
來源:轉載
供稿:網友

  要生成一個半透明的成形窗口,而又要避免使用本地的編碼,唯有靈活地應用screenshot(屏幕快照).

  半透明窗口是大眾對Swing最為渴求的特性之一. 也可以稱之為定形窗口,這種窗口有一部分是透明的,可以透過它看到桌面背景和其它的程序.假如不通過JNI(java Native Interface 本地接口)Java是無法為我們生成一個半透明的窗口的(即使我們可以那樣做,還得本地操作平臺好支持半透明窗口才行).然而這些現狀無法阻止我們對半透明窗口的渴求,通過一個我最喜歡的手段screenshot,我們可以欺騙性地實現這個目的.

  仿造這樣一個的半透明窗口的過程,主要的通過以下幾點:
1.在窗口顯示之前,先獲得一個screenshot;
2.把上一步獲取的屏幕快照,作為窗口的背景圖
3.調整位置,以便于我們捕捉的screenshot和實際當前的屏幕完美結合,制造出一種半透明的假象.

  剛剛說到的部分只是小兒科,重頭戲在于,如何在移動或變化半透明窗口時,及時地更新screenshot,也就是及時更新半透明窗口的背景.

  在開始我們的旅行之前,先生成一個類,讓它繼續 JPanel,我們用這個繼續類來捕捉屏幕,并把捕捉的照片作為背景. 類的具體代碼如下例6-1

例 6-1 。 半透明背景組件
public class TransparentBackground extends Jcomponent {
    PRivate JFrame frame;
    private Image background;

public TransparentBackground(JFrame frame) {
    this.frame = frame;
    updateBackground( );
}
/**
  * @todo 獲取屏幕快照后立即更新窗口背景
  */
public 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) {
        //p(ex.toString( ));
// 此方法沒有申明過,因為無法得知上下文。因為不影響執行效果,先注釋掉它
        ex.printStackTrace( );
    }
}
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);
}
}
  首先,構造方法把一個reference保存到父的JFrame,然后調用updateBackground()方法,在這個方法中,我們可以利用java.awt.Robot類捕捉到整個屏幕,并把捕捉到的圖像保存到一個定義了的放置背景的變量中. paintComponent()方法可以幫助我們獲得窗口在屏幕上的絕對位置,并用剛剛得到的背景作為panel的背景圖,同時這個背景圖會因為panel位置的不同而作對應的移動,以使panel的背景和panel覆蓋的那部分屏幕圖像無縫重疊在一起,同時也就使panel和四周的屏幕關聯起來.

我們可以通過下面這個main方法簡單的運行一下,隨便放置一些組件到panel上,再把panel放置到frame中顯示.
public static void main(String[] args) {
    JFrame frame = new JFrame("Transparent Window");
    TransparentBackground bg = new TransparentBackground(frame);
    bg.setLayout(new BorderLayout( ));
    JButton button = new JButton("This is a button");
    bg.add("North",button);
        JLabel label = new JLabel("This is a label");
    bg.add("South",label);
    frame.getContentPane( ).add("Center",bg);
    frame.pack( );
    frame.setSize(150,100);
    frame.show( );
}
通過這段代碼,運行出的效果如下圖6-1所示:
Swing 破局:打造半透明窗口(圖一)
圖6-1 展示中的半透明窗口

  這段代碼相當簡單,卻帶有兩個不足之處。首先,假如移動窗口,panel中的背景無法自動的更新,而paintComponent()只在改變窗口大小時被調用;其次,假如屏幕曾經發生過變化,那么我們制作的窗口將永遠無法和和屏幕背景聯合成整體。

  誰也不想時不時地跑去更新screenshot,想想看,要找到隱藏于窗口后的東西,要獲得一份新的screenshot,還要時不時的用這些screenshot來更新我們的半透明窗口,這些事情足以讓用戶無法安心工作。事實上,想要獲取窗口之外的屏幕的變化幾乎是不太可能的事,但多數變動都是發生在foreground窗口發生焦點變化或被移動之時。假如你接受這的觀點(至少我接受這個觀點),那么你可以只監控下面提到的幾個事件,并只需在這幾個事件被觸發時,去更新screenshot。
public class TransparentBackground extends JComponent
        implements ComponentListener, WindowFocusListener,
        Runnable {
    private JFrame frame;
    private Image background;
    private long lastupdate = 0;
    public boolean refreshRequested = true;
    public TransparentBackground(JFrame frame) {
        this.frame = frame;
        updateBackground( );
        frame.addComponentListener(this);
        frame.addWindowFocusListener(this);
        new Thread(this).start( );
    }
    public void componentShown(ComponentEvent evt) { repaint( ); }
    public void componentResized(ComponentEvent evt) { repaint( ); }
    public void componentMoved(ComponentEvent evt) { repaint( ); }
    public void componentHidden(ComponentEvent evt) { }

    public void windowGainedFocus(WindowEvent evt) { refresh( ); }    
    public void windowLostFocus(WindowEvent evt) { refresh( ); }
  首先,讓我們的半透明窗口即panel實現ComponentListener接口,
WindowFocusListener接口和Runnable接口。Listener接口可以幫助我們捕捉到窗口的移動,大小變化,和焦點變化。實現Runnable接口可以使得panel生成一個線程去控制定制的repaint()方法。

  ComponentListener接口帶有四個component開頭的方法。它們都可以很方便地調用repaint()方法,所以窗口的背景也就可以隨著窗口的移動,大小的變化而相應地更新。還有兩個是焦點處理的,它們只調用refresh(),如下示意:
public void refresh( ) {
    if(frame.isVisible( )) {
        repaint( );
        refreshRequested = true;
        lastupdate = new Date( ).getTime( );
    }
}
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) {
            p(ex.toString( ));
            ex.printStackTrace( );
        }
    }



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩中文字幕在线| 国产精品678| 深夜福利一区二区| 中文字幕亚洲欧美日韩高清| 欧美大学生性色视频| 日本成人免费在线| 91在线高清免费观看| 日韩av免费在线播放| 亚洲iv一区二区三区| 久久综合88中文色鬼| 欧美在线观看网址综合| 日韩欧美在线一区| 久久久久久久久久久久av| 久久国产精品影视| 中文字幕亚洲综合久久筱田步美| 国产精品美女主播在线观看纯欲| 欧美性极品少妇精品网站| 欧美激情精品久久久久久黑人| 国产在线拍偷自揄拍精品| 欧美一级片一区| 久久久久久久成人| 国产91热爆ts人妖在线| 97视频在线观看亚洲| 久久天天躁狠狠躁老女人| 91久久精品日日躁夜夜躁国产| 久久中文字幕在线| 日韩精品视频免费| www.国产一区| 久久精品成人一区二区三区| 奇米影视亚洲狠狠色| 色偷偷av一区二区三区乱| 精品国产欧美一区二区三区成人| 亚洲精品久久久久久下一站| 成人在线播放av| 国产在线999| 国产精品精品国产| 欧美日韩爱爱视频| 欧美日韩在线免费观看| 国产欧美日韩精品在线观看| 精品偷拍一区二区三区在线看| 欧洲s码亚洲m码精品一区| 日韩欧美亚洲范冰冰与中字| 久久精品欧美视频| 亚洲毛茸茸少妇高潮呻吟| 国产精品白嫩美女在线观看| 97在线看免费观看视频在线观看| 538国产精品一区二区免费视频| 日韩大陆毛片av| 欧美插天视频在线播放| 狠狠色狠狠色综合日日五| www.色综合| 日本亚洲欧洲色| 国产成人综合av| 国产精品一区二区久久精品| 国产精品中文久久久久久久| 久久精品国产亚洲一区二区| 日韩欧美在线免费观看| 亚洲精品乱码久久久久久按摩观| 国内外成人免费激情在线视频| 日韩av手机在线观看| 国产精品一区二区久久国产| 另类色图亚洲色图| 精品成人久久av| 91丝袜美腿美女视频网站| 97视频在线观看免费高清完整版在线观看| 国产精品h在线观看| 91丝袜美腿美女视频网站| 最近2019年好看中文字幕视频| 亚洲欧洲高清在线| 97国产真实伦对白精彩视频8| 亚洲人精选亚洲人成在线| 精品中文字幕在线| 日本亚洲欧洲色α| 九九精品视频在线观看| 国产精品高潮呻吟视频| 国产精品一区二区久久国产| 欧美成年人视频网站| 日本a级片电影一区二区| 成人做爰www免费看视频网站| 国内精品一区二区三区四区| 性日韩欧美在线视频| 日韩欧美一区二区三区久久| 中文字幕欧美精品日韩中文字幕| 亚洲国产高潮在线观看| 美女视频黄免费的亚洲男人天堂| 欧美电影免费观看高清| 亚洲香蕉伊综合在人在线视看| 日韩大陆欧美高清视频区| 欧美在线视频网| 精品久久香蕉国产线看观看亚洲| 国产精品视频色| 亚洲精品黄网在线观看| 欧美成年人网站| 国产精品久久久久7777婷婷| 一区二区三区黄色| 国产精品视频一区二区三区四| 国产精品久久不能| 一本色道久久88综合日韩精品| 国产亚洲综合久久| 亚洲欧美日韩精品久久亚洲区| 欧美激情亚洲综合一区| 美女视频久久黄| 91国产视频在线播放| 亚洲午夜av久久乱码| 久久久久久久久久久网站| 中文字幕精品一区久久久久| 国产精品亚洲一区二区三区| 久久久最新网址| 色天天综合狠狠色| 午夜剧场成人观在线视频免费观看| 午夜剧场成人观在线视频免费观看| 日韩在线不卡视频| 国产91在线播放九色快色| 亚洲国产高清福利视频| 岛国av一区二区| 91视频国产精品| 国模视频一区二区三区| 国产这里只有精品| 亚洲激情自拍图| 在线观看91久久久久久| 国产精品高潮呻吟视频| 欧美人与物videos| 亚洲成**性毛茸茸| 91国产一区在线| 98视频在线噜噜噜国产| 亚洲男人av电影| 色诱女教师一区二区三区| 色偷偷91综合久久噜噜| 欧美日韩视频在线| 日韩麻豆第一页| 国产精品一区=区| 色综合视频一区中文字幕| 成人精品视频99在线观看免费| 亚洲性视频网站| 亚州国产精品久久久| 久久久久久久久国产精品| 亚洲人成毛片在线播放| 超在线视频97| 在线中文字幕日韩| 日韩欧美国产一区二区| 日韩在线视频线视频免费网站| 欧美性生活大片免费观看网址| 欧美精品在线免费观看| 色偷偷av一区二区三区| 91av视频在线观看| 最近2019中文字幕mv免费看| 欧美成人激情视频免费观看| 欧美噜噜久久久xxx| 欧美性一区二区三区| 国产视频欧美视频| 欧美亚洲激情在线| www.色综合| 国产欧美日韩专区发布| 精品日韩视频在线观看| 精品欧美激情精品一区| 欧美丰满少妇xxxxx做受| 日韩成人中文字幕| 亚洲免费精彩视频| 91人人爽人人爽人人精88v| 91亚洲精品久久久| 精品二区三区线观看| 欧美性极品xxxx做受| 亚洲成人三级在线| 国产欧美一区二区三区久久|