簡體   English   中英

設置JFrame而不與任務欄重疊

[英]Setting a JFrame without overlapping with taskbar

我需要有一個未修飾的JFrame( setUndecorated(true) ),需要全屏顯示,而不與任務欄重疊。

我嘗試了以下解決方案。

  • 調用setExtendedState(MAXIMIZED_BOTH)。

    • 優點 :這可以正常工作,即窗口動態調整,除了它有以下問題。
    • 問題最初窗口占據全屏雖然幀動態調整,但它與任務欄重疊。
  • 嘗試使用JFrame.setExtendedState(MAXIMIZED_BOTH)與未修飾幀一起工作的下述解決方案

      GraphicsConfiguration config = aFrame.getGraphicsConfiguration(); Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice()); aFrame.setBounds(0, 0, usableBounds.width, usableBounds.height); 
    • 優點 :我沒有重疊,窗口看起來很好。
    • 問題 :當任務欄位置/大小發生變化時,窗口不會動態調整自身。

任何幫助將不勝感激。

我想到了一個設計。 但不確定其可行性。 我可以使用setBounds()。 但是,當調整任務欄或重新定位任務欄時,我需要通知我的框架。 有辦法嗎?

能夠使用以下代碼解決上述問題,

Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice());
setMaximizedBounds(usableBounds);
setExtendedState(MAXIMIZED_BOTH);

因此,通過getUsableBounds我可以獲得離開任務欄的界限。 因此我使用setExtendedState(MAXIMIZED_BOTH) ,當我重新調整/重新定位任務欄時,窗口會自動更新。 :-)

final Point x = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();

有一個單獨的線程來檢查任務欄是否被更改。 如果是這樣更新大小

new Thread(new Runnable() {
     @Override
     public void run() {
        if (x.equals(GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint())) {
           Rectangle r = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
           setSize(r.getSize());
        }
        try {
           Thread.sleep(5000);
        } catch (InterruptedException ex) {
           Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
  }).start();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM