2013-02-20 171 views
5

大家好我最近遇到了這個問題,現在有些顯示器有不同的DPI設置,有些顯示器比較密集,例如Apple的Retina顯示器。Java/Swing如何處理不同的屏幕DPI和密度設置?

如何用Java補償不同DPI設置和密度的不同顯示器?是否可以在任何顯示器上將控件縮放爲相同的尺寸。我知道在爲Android進行編程時,所有測量值都在「DP」中,您可以爲三種不同的顯示密度指定不同的圖像。

有沒有一種方法可以選擇不同的圖像使用Java/Swing的不同顯示密度,所以我的應用程序在高密度顯示器上看起來並不模糊?或者這不是那麼重要或不可能?我知道Chrome目前不考慮DPI,但Internet Explorer和其他應用可以。

感謝你的幫助,我很長一段時間的Java開發人員,我從來沒有想過之前DPI,並想知道我怎麼會去一下:)

回答

4

首先,信任平臺的外觀&感覺設計師爲文本和控件選擇合理的默認尺寸。然後,避免挫敗這些違約的誘惑。這裏有一些啓發:

3

首先感謝您爲他們提供的有用鏈接非常有用的垃圾回收。

下面我列出了一些關於如何處理有關我遇到的DPI更改的問題的詳細信息。

字體問題:

如果字體沒有在部件裝配,然後看看下面組件選型問題進行經常組件未過篩裏面是什麼。否則,在JLabel中,您可以應用HTML標記來自動換行文本(還有其他解決方案,但這適用於我)。

如果組件的文本自然是默認的字體,大小和樣式(Tahoma 11 plain),那麼一切都會自動完成。知道user574171在回答How to set the DPI of Java Swing apps on Windows/Linux?時,給出了顯示不同字體和佈局管理器問題和優點的圖片,鏈接到http://kynosarges.org/GuiDpiScaling.html。這裏的問題是關於「Swing」問題的問題,但是他的鏈接在比較WPF,JavaFX和Swing佈局與基本組件和不同字體時也很有用。你可以看到那裏的「Swing a」字體是最好的,那就是Tahoma 11 Plain。但是,只有組件自然是默認的字體,大小和樣式(Tahoma 11 Plain)時纔可以使用。這意味着粗體,下劃線,大小和文本的不同字體會導致不同DPI的自動調整大小。

如果文本是默認字體(Tahoma),但粗體,下劃線或不同大小,則文本不會針對不同的DPI進行縮放。要修復不同DPI的縮放比例,請選中標有「從默認字體導出字體」的框。 「相對」選項將採用默認的DPI縮放字體,並應用相對更改,如更大或更小,粗體和下劃線。也知道,如果組件是JLabel,那麼無論您如何設置文本格式(行換行),DPI縮放都會自動使用HTML標記。

如果組件不是天然的默認字體,樣式和大小(Tahoma 11 plain)或者您想要不同的字體(即不是Tahoma),那麼您需要關聯另一個組件中的更改,一個JLabel。因此,如果125 DPI將字體增加3,則可以相同地增加所需的字體。

組件選型問題:

所有組件都有一個首選,最小和最大尺寸的屬性,但我發現,他們不DPI的變化打得好。垃圾回答中的「尊重組件preferred size」子彈告訴你所有關於它的信息。總結一下,讓組件的默認大小照顧自己,因爲它會嘗試調整到任何內部的大小。

如果組件可以使用默認大小,則可以爲您完成DPI處理。正如垃圾桶的說法:「首先,相信平臺的外觀&感受設計師爲文本和控件選擇合理的默認尺寸,然後避免挫敗這些默認設置的誘惑。」同樣,默認大小的組件通常與內部大小(或可重新調整大小)相同。根據我自己的經驗,當我設置可重新定義的組件時,我通過「Horizo​​ntal Resizable」或「Vertical Resizable」進行設置,因爲我發現它在DPI更改以及窗口大小調整方面效果非常好。

如果組件的默認大小不起作用,那麼首先嚐試查看我發現的一些特定問題。或者,可以嘗試根據組件的變化來對組件進行縮放,該組件可以正確縮放。 IE,應用您預期的縮放比例爲100%DPI的比率和新DPI的變化。需要縮放到其他組件更改的組件示例應該是文本由代碼填充或它是圖像的組件。

作爲最後的手段使用JScrollPane允許用戶滾動查看整個事情。如果窗口/對話框相當大,那麼JScrollPane是一個好主意,因爲如果DPI對於用戶的視力較高,那麼窗口通常比屏幕大。

注: 我發現在JPanel中封裝組件組有助於擺動控制DPI更改。

JTextField的大小問題:

,如果你想設置列屬性,沒有別的,但文本。列屬性是您想要顯示的字母或數字的數量。通常在允許用戶輸入號碼時使用。瞭解columns屬性對於多個平臺很有用。

JSpinner的大小問題:

設置模型是準確的,有效的,和默認值。因此,組件的自動調整大小是爲了實現最大值,並且對DPI更改和其他平臺非常有用。

錶行高度問題:

錶行的高度不具有較高的DPI改變。我遇到了這個問題,這似乎是由於我試圖與舊版本的Java兼容。要修正由於DPI更改導致的字體大小比率更改或JLabel高度比率更改。

0

使用JRE 9(或更高版本)。

這是因爲Java運行時(舊版本)宣稱自己是「DPI感知」的,但並未真正支持AWT和Swing。 Java應用程序的大小和渲染基於像素,而不是正確縮放,這包括HiDPI顯示。無論如何,這已經被最近解決了。 查看問題JEP 263: HiDPI Graphics on Windows and Linuxupgrade

因此,增加字體大小不起作用(因爲它不會增加其餘的東西); jvm參數-Dsun.java2d.dpiaware=false不起作用(因爲它不是真的支持);並且清單文件+註冊表編輯(對於Windows)不起作用。

然後,您需要在JRE 9上運行它,因爲它確實支持此功能。