改變Swing應用程式的預設字型 字型大小

2021-08-26 03:39:20 字數 4103 閱讀 3596

改變swing應用程式的預設字型/字型大小

經常使用swing作為程式ui的人可能會注意到,swing元件預設顯示文字的字型大小為11。這對於英文顯示毫無問題,但是如果用這個字型大小顯示中文的話,這麼小的字型大小就會使程式變得很難看。我當年在用ireport0.56的時候就發現他的選單欄和彈出的dialog裡的字很難看,但是將字型大小調大之後就好多了。雖然在最近版本的jdk裡似乎修正了這個字型問題,但是如果你的程式必須使用以前版本的jdk的話,這個問題就需要處理一下,下面就是乙個不錯的解決方案:

font vfont = new font("dialog", font.plain, 13);

uimanager.put("tooltip.font", vfont);

uimanager.put("table.font", vfont);

uimanager.put("tableheader.font", vfont);

uimanager.put("textfield.font", vfont);

uimanager.put("combobox.font", vfont);

uimanager.put("textfield.font", vfont);

uimanager.put("passwordfield.font", vfont);

uimanager.put("textarea.font", vfont);

uimanager.put("textpane.font", vfont);

uimanager.put("editorpane.font", vfont);

uimanager.put("formattedtextfield.font", vfont);

uimanager.put("button.font", vfont);

uimanager.put("checkbox.font", vfont);

uimanager.put("radiobutton.font", vfont);

uimanager.put("togglebutton.font", vfont);

uimanager.put("progressbar.font", vfont);

uimanager.put("desktopicon.font", vfont);

uimanager.put("titledborder.font", vfont);

uimanager.put("label.font", vfont);

uimanager.put("list.font", vfont);

uimanager.put("tabbedpane.font", vfont);

uimanager.put("menubar.font", vfont);

uimanager.put("menu.font", vfont);

uimanager.put("menuitem.font", vfont);

uimanager.put("popupmenu.font", vfont);

uimanager.put("checkboxmenuitem.font", vfont);

uimanager.put("radiobuttonmenuitem.font", vfont);

uimanager.put("spinner.font", vfont);

uimanager.put("tree.font", vfont);

uimanager.put("*******.font", vfont);

uimanager.put("optionpane.messagefont", vfont);

uimanager.put("optionpane.buttonfont", vfont);

這段**用在程式的開始部分,可以有效地將swing元件的顯示字型設定為我們在vfont所設定的內容。

1.1 讓視窗更好地居中顯示

無論是頂層元件jframe還是對話方塊jdialog,讓他們的視窗居中顯示是乙個很常見的問題,因為他們預設總是從左上角彈出來,這也太不爽了!對於這個問題,jbuilder應用程式生成嚮導給出了解決方案:

dimension screensize = toolkit.getdefaulttoolkit().getscreensize();

dimension framesize = frame.getsize();

if (framesize.height > screensize.height)

framesize.height = screensize.height;

if (framesize.width > screensize.width)

framesize.width = screensize.width;

frame.setlocation((screensize.width-framesize.width)/2,screensize.height-framesize.height) / 2);

這個方法對於大多數視窗元件來說都足夠了,但是還有其他問題存在,比如說解析度和顯示器的尺寸都會導致應用程式視窗「變形」,明明在17寸顯示器1024*768解析度下顯示好好的視窗到了19寸的1280*800的 寬屏下就會被「拉」得很「長」。於是,雖然有布局管理器幫我們管理拉伸後元件的放置,但仍然解決不了拉長後帶來的美觀問題。我的經驗是,對於某些視窗,由 於它被「拉長」之後由於其內部元件之間的間隙變大,會顯得很難看。所以應該為他們設定乙個最合適的顯示大小。在居中顯示的時候只調整位置而不改變大小,這 樣就不會影響視窗的美觀。所以我們只需要對上面的**小改一下即可,以jframe為例:

dimension screensize = toolkit.getdefaulttoolkit().getscreensize();

screensize = toolkit.getdefaulttoolkit().getscreensize();

frame.setpreferredsize(new dimension(512,450));

int framewidth = this.getpreferredsize().width;

int frameheight = this.getpreferredsize().height;

frame.setsize(framewidth, frameheight);

frame.setlocation((screensize.width - framewidth) / 2,(screensize.height - frameheight) / 2);

2 自定義jframe的關閉事件

有的時候,當使用者關閉應用程式視窗的時候,我們可能希望程式在結束之前儲存一些必要的資料。對於這種需求,我們有兩種備選方案:

2.1 獲取程式關閉的「鉤子」

runtime.getruntime().addshutdownhook(shutdownhook);

protected thread shutdownhook = new platformshutdownhook();

protected class platformshutdownhook extends thread

}通過這種方法,我們就可以在程式結束時獲得通知,以便進行一些儲存或清理的工作。然而這種方法的缺點是,在程式收到結束通知的時候,所有的ui元件已經被銷毀了,使用者此時看到的是程式已經結束。而事實上如果程式儲存需要花很長的時間的話,使用者是不能獲取任何資訊的,這是乙個很糟糕的使用者體驗。因為如果這時使用者關機的話,程式就有可能丟失尚未儲存的資訊,而對於這一切,使用者並不知情。

2.2 處理jframe關閉事件

為了在ui被銷毀之前收到程式結束的訊息,我們需要自行處理視窗關閉的事件。注意在這裡我們沒有採用addactionlistener(……)方法,因為這樣做只能讓我們在視窗關閉之後收到通知,這樣就與上面的方法沒什麼區別了。

我們需要在jframe的建構函式中設定:

//設定標誌,讓mainframe自己接收視窗事件

enableevents(awtevent.window_event_mask);

然後再實現下面的函式:

protected void processwindowevent(final windowevent pevent) else

}如此一來,我們就可以在視窗被關閉之前通知使用者程式正在儲存資料的資訊,例如後面提到的infiniteprogresspanel可以顯示的內容。

監視android應用程式資料改變

以settings系統應用程式settings.system.auto time變數為例 就是那個網路時間同步開關了。1.定義contentobserver 響應onchange函式重寫。private contentobserver mautotimeobserver new contentobs...

應用程式寫資料到套接字

tcp輸出 每個tcp套接字都有乙個傳送緩衝區,可以用so sendbuf套接字選項來更改該緩衝區的大小。當某個應用程式呼叫write時,核心從該應用程序緩衝區中複製所有資料到套接字的傳送緩衝區。如果套接字的傳送緩衝區容不下該應用程序的所有資料則該應用程序被投入睡眠。假設該套接字是阻塞的,則writ...

如何為Android應用程式設定預設活動

在android中,您可以通過遵循 androidmanifest.xml 中的 intent filter 來配置應用程式的啟動活動 預設活動 請參閱以下 片段,將活動類 logoactivity 配置為預設活動。檔案 androidmanifest.xml 例如,假設您有兩個活動類,並且要將 l...