2012-03-02 37 views
8
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

class Demo 
{ 
    JFrame jf; 
    Demo() 
    { 
     jf=new JFrame("Demo"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(5000,5000); 
     jf.setVisible(true); 
     System.out.println(jf.getSize()); 
    } 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       new Demo(); 
      } 
     }); 
    } 
} 

工作,我用jf.setSize(5000, 5000)爲JFrame的,但之後的getSize返回其他尺寸:java.awt.Dimension[width=1386,height=788](我的屏幕分辨率爲1366×768)我可以設置幀大小比屏幕尺寸更大?可能這種行爲提供了一些框架屬性,但我不知道它們。的setSize()不爲JFrame的

+0

窗口大於屏幕的預期行爲是什麼? – Thomas 2012-03-02 16:31:06

+6

@Thomas - 激怒最終用戶,我相信... – mcfinnigan 2012-03-02 16:32:53

+0

此代碼只適用於我的Linux機器 – Robin 2012-03-02 16:41:24

回答

10

嘗試使用setPreferredSize而不是setSize。適用於我的情況(Ubuntu 12.04 + GNOME 3)。

+0

最短,即最佳答案 – jan 2014-04-03 07:22:20

+0

這解決了它。謝謝! – anon58192932 2014-06-11 00:00:57

3

我嘗試了呼叫的幾個組合,以及以下似乎工作:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jf.setPreferredSize(new Dimension(5000,5000)); 
jf.setMaximumSize(new Dimension(5000,5000)); 
jf.setMinimumSize(new Dimension(5000,5000)); 
jf.pack(); 
jf.setVisible(true); 

它仍然打印出不同尺寸,但窗口出現要遠遠大於它打印。

+0

在這種情況下,尺寸改變窗戶第一次移動後。最初窗口具有相同的大小。 – eXXXXXXXXXXX2 2012-03-02 16:49:43

+0

@eXXXXXXXXXXX不幸的是,這是我能做的最好的。你可以嘗試添加'jf.setResizable(false);'。 – jjnguy 2012-03-02 16:50:50

+0

設置pref和min加上最小化框架「工作」在這裏 - 但沒有生產,因爲它最有可能高度依賴於操作系統依賴記錄參見@Stephen C – kleopatra 2012-03-02 17:04:06

7

的Javadoc這樣說:

「的方法改變了的幾何形狀相關的數據。因此,該本地窗口系統可以忽略這樣的請求,或者它可修改所請求的數據,從而使窗口對象。以與桌面設置密切對應的方式放置和調整大小。「

這涵蓋了您正在觀察/抱怨的行爲。

這不是很清楚,但Window.setSize(...)有這種行爲的一個原因是窗口管理器(Java外部)通常會否決應用程序嘗試執行此操作。據推測,這是因爲它是開放的濫用和「不是用戶想要的」。無論如何,最終不是你的應用程序打電話來覆蓋窗口管理器的限制。

4

爲了週五的樂趣(也就是說,你應該考慮在生產環境中做什麼:-) - 用@jinguy代碼進一步演奏,我發現在最小化幀之後使用了大於生命的尺寸。這樣做編程讓它出現的怪物從一開始

jf.setPreferredSize(new Dimension(5000,5000)); 
    jf.setMinimumSize(new Dimension(5000,5000)); 
    jf.pack(); 
    jf.setVisible(true); 
    jf.setState(Frame.ICONIFIED); 
    jf.setState(Frame.NORMAL); 
    System.out.println(jf.getSize()); 
1

這些都是我的觀察(使用1.6,現在我使用的是1.7 XP下):

你可以擁有的未裝飾框「幾乎」任何大小 - 我使用1280x1024(旋轉)的屏幕分辨率,並沒有發現任何問題與幀1500x1500,雖然有些幀2000x2000看起來不完整(但工作)和4000x4000框架顯示其拇指在任務欄,但這拇指是無效的和框架本身不會出現。我認爲未修飾的JFrame的最大可能大小取決於依賴於圖形硬件的系統功能。

裝飾框架有一個簡單的故事 - 它們可能比屏幕尺寸稍大(通常幾個像素)。

在我與運行時間期間確定尺寸應用(例如遊戲,其中設置板大小動態地)我使用下面的方法:

1)。在將相對於null的設置框架位置打包之前。它將JFrame的左上角放置在屏幕中間(JFrame包裝(0,0)尺寸之前)

2)。設置我的框架內容的首選尺寸(我總是使用單個JPanel)並記住它們

3)。包裝框架

4)。如果包後的幀大小與包放置幀之前的大小不匹配,請刪除內容的JPanel,將JscrollPane添加到此JPanel中,並將JScrollPane的首選大小設置爲JPanel首選大小加上JScrollBar固定大小(即垂直滾動條的寬度和水平高度)。 5)。再次打包 - 這樣可以確保只顯示必要的滾動條(如果不增加JFrame大小,那麼兩個滾動條將始終顯示 - 還需要刪除JScrollPane默認邊框)。 6)。通過向左移動並向上移動相應大小的一半來設置框架的新位置以將其居中。