Java开发笔记(一百三十八)JavaFX的箱子
前面介绍了javafx标签控件的用法,其中提到label文本支持中文字体,那么它到底支持哪些中文字体呢?自然要看当前的操作系统都安装了哪些字体才行,对于中文的windows系统,默认安装了黑体“simhei”、宋体“nsimsun”、仿宋“fangsong”与楷体“kaiti”。在awt与swing的体系中,font工具支持填入中文字体的名称;但在javafx编程之中,font工具则要填写中文字体的拼音。除了这四种基础字体以外,只要系统安装了中文office,则还会增加下述的中文字体,这些字体也可用于javafx代码:
隶书:lisu
幼圆:youyuan
方正舒体:fzshuti
方正姚体:fzyaoti
华文细黑:stxihei
华文楷体:stkaiti
华文宋体:stsong
华文中宋:stzhongsong
华文仿宋:stfangsong
华文彩云:stcaiyun
华文琥珀:sthupo
华文隶书:stliti
华文行楷:stxingkai
华文新魏:stxinwei
在界面布局方面,javafx也做了补充增强。原来awt/swing框架拥有三种布局:流式布局、网格布局、边界布局,然而缺少了两种常见布局:左右排列的水平布局和上下排列的垂直布局。尽管流式布局也是从左到右排列,但一行塞不下了会自动换行,无法实现固定展示一行的效果。单列多行的网格布局固然貌似垂直布局,但每个网格的高度是固定的,难以满足每行高度灵活变化的要求。awt与swing身为上个世纪的老古董,早已停止了功能扩充,所幸javafx适时推出了水平布局和垂直布局的参照控件。其中对照水平布局的控件名叫水平箱子hbox,对照垂直布局的控件名叫垂直箱子vbox,它俩名义上是箱子,其实跟流式窗格、网格窗格、边界窗格同样属于窗格大家族。在编码的时候,hbox和vbox的用法接近于流式窗格flowpane,可以将它们看作是一种特殊的流式窗格。
接下来通过具体的代码来演示水平箱子和垂直箱子的作用,为了更好地观察箱子内部的标签文本,首先定义一个获取标签对象的公共方法getlabel,该方法的实现代码如下所示:
// 获得指定文本及字体的标签
private label getlabel(string text, font font) {
label label = new label(text); // 创建一个标签
label.setfont(font); // 设置标签的字体
label.setalignment(pos.center); // 设置标签的对齐方式
label.setwraptext(true); // 设置标签文本是否支持自动换行
return label;
}
然后创建一个水平箱子,并往该箱子里依次添加四个文本标签,相关的操作代码片段示例如下:
button btn1 = new button("水平排列"); // 创建一个按钮
btn1.setonaction(new eventhandler<actionevent>() { // 设置按钮的单击事件
@override
public void handle(actionevent arg0) { // 处理单击事件
hbox hbox = new hbox(); // 创建一个水平箱子
hbox.setalignment(pos.center); // 设置水平箱子的对齐方式
hbox.getchildren().add(getlabel("离离原上草", font.font("simhei", 25))); // 给水平箱子添加一个标签
hbox.getchildren().add(getlabel("一岁一枯荣", font.font("kaiti", 25))); // 给水平箱子添加一个标签
hbox.getchildren().add(getlabel("野火烧不尽", font.font("nsimsun", 25))); // 给水平箱子添加一个标签
hbox.getchildren().add(getlabel("春风吹又生", font.font("fangsong", 25))); // 给水平箱子添加一个标签
borderpane.setcenter(hbox); // 把水平箱子放到边界窗格的*
}
});
flowpane.getchildren().add(btn1); // 往流式窗格上添加按钮
运行包括上述测试代码的程序,单击按钮后的窗口界面如下图所示,可见此时四个文本标签从左到右挤在了同一水平方向。
接着创建一个垂直箱子,也往该箱子依次添加四个文本标签,相关的操作代码片段示例如下:
button btn2 = new button("垂直排列"); // 创建一个按钮
btn2.setonaction(new eventhandler<actionevent>() { // 设置按钮的单击事件
@override
public void handle(actionevent arg0) { // 处理单击事件
vbox vbox = new vbox(); // 创建一个垂直箱子
vbox.setalignment(pos.center); // 设置垂直箱子的对齐方式
vbox.getchildren().add(getlabel("离离原上草", font.font("lisu", 30))); // 给垂直箱子添加一个标签
vbox.getchildren().add(getlabel("一岁一枯荣", font.font("youyuan", 30))); // 给垂直箱子添加一个标签
vbox.getchildren().add(getlabel("野火烧不尽", font.font("stxingkai", 30))); // 给垂直箱子添加一个标签
vbox.getchildren().add(getlabel("春风吹又生", font.font("stxinwei", 30))); // 给垂直箱子添加一个标签
borderpane.setcenter(vbox); // 把垂直箱子放到边界窗格的*
}
});
flowpane.getchildren().add(btn2); // 往流式窗格上添加按钮
再次运行包括上述测试代码的程序,单击按钮后的窗口界面如下图所示,可见此时四个文本标签改成从上到下的垂直排列了。
更多java技术文章参见《java开发笔记(序)章节目录》