改变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("ToolBar.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 {
public void run()
{
//一些清理工作在这里进行……
}
}
通过这种方法,我们就可以在程序结束时获得通知,以便进行一些保存或清理的工作。然而这种方法的缺点是,在程序收到结束通知的时候,所有的UI组件已经被销毁了,用户此时看到的是程序已经结束。而事实上如果程序保存需要花很长的时间的话,用户是不能获取任何信息的,这是一个很糟糕的用户体验。因为如果这时用户关机的话,程序就有可能丢失尚未保存的信息,而对于这一切,用户并不知情。
2.2 处理JFrame关闭事件
为了在UI被销毁之前收到程序结束的消息,我们需要自行处理窗口关闭的事件。注意在这里我们没有采用addActionListener(……)方法,因为这样做只能让我们在窗口关闭之后收到通知,这样就与上面的方法没什么区别了。
我们需要在JFrame的构造函数中设置:
//设定标志,让MainFrame自己接收窗口事件
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
然后再实现下面的函数:
protected void processWindowEvent(final WindowEvent pEvent) {
if (pEvent.getID() == WindowEvent.WINDOW_CLOSING) {
/** 防止用户多次点击“关闭”按钮造成重复保存 **/
if( !isClosing ) isClosing = true;
else return;
//处理JFrame关闭事件……
}else{
//忽略其他事件,交给JFrame处理
super.processWindowEvent(pEvent);
}
}
如此一来,我们就可以在窗口被关闭之前通知用户程序正在保存数据的信息,例如后面提到的InfiniteProgressPanel可以显示的内容。
分享到:
相关推荐
#### 四、改变Swing应用程序的默认字体和字号 Swing组件默认使用的字体大小对于中文显示而言可能显得较小,这会影响用户体验。为了改善这一点,可以通过修改`UIManager`中的字体属性来实现全局字体大小的调整。下面...
在大多数操作系统和编程环境中,菜单通常是由系统或应用程序的默认字体呈现的。为了实现“改变菜单字体”的功能,开发者需要深入理解图形用户界面(GUI)的事件处理机制,以及字体和字号相关的API接口。在Windows...
FCKeditor是一款强大的开源文本编辑器,主要用于网页和应用程序中的富文本输入。它支持多种浏览器,包括Internet Explorer、Firefox、Chrome等,提供了丰富的文本格式化功能,如字体、字号、颜色、对齐方式等,还...
此外,设置适当的字体、字号、颜色和高亮显示也是提高可读性和美观度的重要手段。 通过这个项目,初级Java开发者可以熟悉Java GUI编程,学习文件I/O操作,以及处理用户交互事件。同时,对字符统计和行定位功能的...
7. **字体选择**:`JTextComponent`允许用户改变字体和字号,通过`setFont()`方法设置。`Font`类提供创建和管理字体的接口。 8. **界面布局**:Java Swing提供了多种布局管理器,如`FlowLayout`、`GridLayout`、`...
- **题目描述:** 某应用程序定义的类C17是JPanel的子类,在类C17的对象中需要绘图,则在类C17中应重写的方法是? - **解析:** 在Swing中,自定义绘图可以通过重写`paintComponent(Graphics g)`方法来实现。 - **...
Java记事本是一款基于Java编程语言开发的应用程序,它的功能设计和Windows系统内置的记事本非常相似。作为一款文本编辑器,它提供了基础的文字录入、编辑和保存等操作,使得用户可以在Java环境下进行简单的文本处理...
18. **定制工具栏**:在许多应用程序中,可以通过“工具”菜单来定制工具栏。 19. **Hub的含义**:Hub是集线器的简称,是局域网中用于连接多台设备的中心设备,允许数据在多个设备间传输。 20. **Web资源的唯一...
4. **记事本初始化**:启动时加载默认配置,如字体、字号等,可能通过Properties类来管理配置信息。 **第五章 系统测试** 1. **界面测试**:验证UI元素的布局、大小、颜色等是否符合设计要求,确保无视觉错误。 2...
1. Word文档字体大小的改变:在Word中,用户可以通过格式工具栏或者菜单栏中的“字体”设置,快速调整文本的字体大小,以满足文档排版需求。 2. 通用对话框控件的FileName属性:FileName属性用于获取或设置用户在...
3. 文字字型要素:字体、风格和字号是构成字型的基本要素,而颜色不是。选项A错误。 4. Python函数调用:在给定的Python代码中,hub函数内部改变了局部变量ss的值,但不会影响外部的ss。print:ss, hub(ss, 3)的结果...
- **知识点**: ASP.NET是一个用于构建动态Web应用程序的框架,支持多种编程语言。 - **结论**: ASP.NET不支持PHP语言。 #### 22. 日期表达式验证 - **知识点**: 在处理日期数据时,经常需要验证一个字符串是否...