- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章初步了解javafx由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
javafx 介绍 。
一提到java的图形界面库,我们通常听到的都是swing,或者更老一点的awt,包括很多书上面介绍的也都是这两种。很多学校、培训班教学的也是这两种技术。但是其实这两种技术都已经过时很长时间了。swing虽然学起来也不算很难,但是用它来写界面其实也很不好写。因为它的界面和代码没有做到分离,所以在编写的时候,代码中肯定充斥着大量坐标,修改极其不易。这方面做的比较好的就是微软的wpf,只能说谁用谁知道.
当然,虽然编写客户端图形程序是java的弱项,但是java并没有放弃这方面的努力。今天介绍的javafx就是java在编写图形界面程序的最新技术。如果你准备使用java编写图形界面程序,又没有历史包袱,那么强烈推荐使用javafx.
这是oracle官网关于javafx的资源和文档.
这是官方的示例程序,我们可以参考javafx的部分来学习如何使用。下面是其中一个分形的javafx程序,点击上面的数字可以进入不同的微观展示,感觉有一种看病毒微观世界的感觉,很震撼.
如何安装 。
只要你安装了最新版本的jdk 8,那么就可以使用javafx库了。如果没有安装的话,那么赶快开始安装吧.
快速上手 。
第一个程序 。
新建一个项目,然后编写如下的类,然后编译运行,即可看到结果。关于这个程序不用做解释吧。如果有学习过swing以及其他图形界面框架的经验的话,应该非常容易理解这段代码。当然由于javafx是新东西,所以我也顺便使用java 8的新特性——lambda表达式.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
yitian.javafxsample;
import
javafx.application.application;
import
javafx.scene.scene;
import
javafx.scene.control.button;
import
javafx.scene.layout.stackpane;
import
javafx.stage.stage;
public
class
hellojavafx
extends
application {
@override
public
void
start(stage primarystage)
throws
exception {
button btn =
new
button();
btn.settext(
"你好啊,世界"
);
btn.setonaction(event -> {
system.out.println(
"你好,世界!"
);
}
);
stackpane root =
new
stackpane();
root.getchildren().add(btn);
scene scene =
new
scene(root,
300
,
250
);
primarystage.settitle(
"hello world!"
);
primarystage.setscene(scene);
primarystage.show();
}
public
static
void
main(string[] args) {
launch(args);
}
}
|
运行截图如下.
用户输入 。
这个程序可以用来处理用户登录的情况,代码如下,重要部分都添加了注释。代码的最后一部分使用setonaction函数为按钮添加了点击事件,当点击按钮的时候会显示文本.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public
class
userinput
extends
application {
@override
public
void
start(stage primarystage)
throws
exception {
//网格布局
gridpane grid =
new
gridpane();
grid.setalignment(pos.center);
//网格垂直间距
grid.sethgap(
10
);
//网格水平间距
grid.setvgap(
10
);
grid.setpadding(
new
insets(
25
,
25
,
25
,
25
));
//新建场景
scene scene =
new
scene(grid,
300
,
275
);
primarystage.setscene(scene);
//添加标题
text scenetitle =
new
text(
"welcome"
);
scenetitle.setfont(font.font(
"tahoma"
, fontweight.normal,
20
));
grid.add(scenetitle,
0
,
0
,
2
,
1
);
//添加标签及文本框
label username =
new
label(
"用户名:"
);
grid.add(username,
0
,
1
);
textfield usertextfield =
new
textfield();
grid.add(usertextfield,
1
,
1
);
//添加标签及密码框
label pw =
new
label(
"密码:"
);
grid.add(pw,
0
,
2
);
passwordfield pwbox =
new
passwordfield();
grid.add(pwbox,
1
,
2
);
//添加提交按钮
button btn =
new
button(
"登录"
);
hbox hbbtn =
new
hbox(
10
);
hbbtn.setalignment(pos.bottom_right);
hbbtn.getchildren().add(btn);
grid.add(hbbtn,
1
,
4
);
//提交文本提示
final
text actiontarget =
new
text();
grid.add(actiontarget,
1
,
6
);
btn.setonaction(event -> {
actiontarget.setfill(color.firebrick);
actiontarget.settext(
"已经登录"
);
}
);
primarystage.settitle(
"javafx welcome"
);
primarystage.show();
}
public
static
void
main(string[] args) {
launch(args);
}
}
|
程序运行截图如下.
这个程序其实也没什么难点,就是使用了网格布局,然后将每个元素添加到网格中。关于网格布局的属性意义可以参考官方的图.
用fxml设计用户界面 。
现代图形界面框架都支持将界面和代码分离开,而且比较常用的描述语言是xml,例如qt的qml、wpf的xaml,当然javafx也有类似的语言,叫做fxml。如果需要详细了解fxml,可以参考oracle官网的文章introduction to fxml.
下面用fxml重写一下上面那个小例子,每个部分都做了注释。如果学习过其他类似描述语言的话,会发现这些其实都差不多。唯一需要注意的就是布局里面的fx:controller属性,它指定一个控制器,控制器的作用就是编写界面对应的代码.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<!--导入类-->
<?
import
javafx.geometry.insets?>
<?
import
javafx.scene.control.*?>
<?
import
javafx.scene.layout.*?>
<?
import
javafx.scene.text.font?>
<?
import
javafx.scene.text.text?>
<!--设置布局-->
<gridpane xmlns=
"http://javafx.com/javafx"
xmlns:fx=
"http://javafx.com/fxml"
fx:controller=
"yitian.javafxsample.controller"
prefheight=
"400.0"
prefwidth=
"600.0"
alignment=
"center"
hgap=
"10"
vgap=
"10"
>
<padding>
<insets top=
"25"
right=
"25"
bottom=
"10"
left=
"25"
/>
</padding>
<!--欢迎文本-->
<text text=
"welcome"
gridpane.columnindex=
"0"
gridpane.rowindex=
"0"
gridpane.columnspan=
"2"
>
<font>
<font name=
"consolas"
size=
"20"
/>
</font>
</text>
<label text=
"用户名:"
gridpane.columnindex=
"0"
gridpane.rowindex=
"1"
/>
<textfield
gridpane.columnindex=
"1"
gridpane.rowindex=
"1"
/>
<label text=
"密码:"
gridpane.columnindex=
"0"
gridpane.rowindex=
"2"
/>
<passwordfield fx:id=
"passwordfield"
gridpane.columnindex=
"1"
gridpane.rowindex=
"2"
/>
<!--按钮及提示文本-->
<hbox spacing=
"10"
alignment=
"bottom_right"
gridpane.columnindex=
"1"
gridpane.rowindex=
"4"
>
<button text=
"显示密码"
onaction=
"#showpasswordbutton"
/>
</hbox>
<text fx:id=
"hinttext"
gridpane.columnindex=
"0"
gridpane.columnspan=
"2"
gridpane.halignment=
"right"
gridpane.rowindex=
"6"
/>
</gridpane>
|
下面就是这个fxml文件对应的控制器,它是一个标准的java类。在fxml中用fx:id属性指定的id,可以在控制器中声明为一个类字段,通过这个字段就可以和界面组件进行交互。同样道理,onaction声明的事件处理程序,在控制器中就是一个方法。注意这些字段和方法都需要使用@fxml注解进行标注.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
javafx.event.actionevent;
import
javafx.fxml.fxml;
import
javafx.scene.control.passwordfield;
import
javafx.scene.text.text;
public
class
controller {
@fxml
private
text hinttext;
@fxml
private
passwordfield passwordfield;
@fxml
protected
void
showpasswordbutton(actionevent event) {
hinttext.settext(
"显示密码:"
+ passwordfield.gettext());
}
}
|
最后要做修改的就是主程序了。在主程序中需要使用fxmlloader来加载fxml资源,其他部分没有太大变化.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
usefxml
extends
application {
@override
public
void
start(stage primarystage)
throws
exception {
parent root = fxmlloader.load(getclass().getresource(
"ui.fxml"
));
scene scene =
new
scene(root,
300
,
275
);
primarystage.settitle(
"使用fxml"
);
primarystage.setscene(scene);
primarystage.show();
}
public
static
void
main(string[] args) {
launch(args);
}
}
|
程序运行截图如下.
如果希望修改组件样式,javafx提供了css接口,让我们可以直接使用css文件修改样式。首先需要在fxml文件中添加相应样式表的引用。文件名前面的@表示这个css文件和fxml文件在同一目录下.
1
2
3
4
5
|
<gridpane>
<stylesheets>
<url value=
"@style.css"
/>
</stylesheets>
<gridpane/>
|
样式表和普通的样式表差不多,只不过需要添加javafx特有的前缀-fx-.
1
2
3
|
#btnshowpassword {
-fx-background-color: deeppink;
}
|
上面用了id选择器,所以对应地,在fxml中也需要id属性.
1
2
|
<button id=
"btnshowpassword"
text=
"显示密码"
onaction=
"#showpasswordbutton"
/>
|
自定义之后的程序如图所示。这里只简单修改了一下按钮的背景色,其实可以更改的样式有很多,包括程序背景等等,有兴趣的同学可以自行尝试.
总结 。
以上就是本文关于初步了解javafx的全部内容,如果有同学想使用java编写图形界面程序,可以考虑使用javafx,这是一个很不错的选择。希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。
原文链接:http://blog.csdn.net/u011054333/article/details/77725614 。
最后此篇关于初步了解javafx的文章就讲到这里了,如果你想了解更多关于初步了解javafx的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我不知道这是不是问这种问题的最佳地点, 我看到一些 JavaFX伙计们,重新标记 一些问题通过替换 javafx来自 javafx-2并采用新的 javafx-8 .它被弃用了还是什么? 编辑 : 不
错误本身: Error:java: invalid flag: --add-modules=javafx.fxml,javafx.graphics,javafx.controls,javafx.bas
这个想法是让一个应用程序在每个显示器上显示两个不同的窗口(阶段),该应用程序应该知道计算机有多少个显示器及其分辨率。 javafx有可能吗? 最佳答案 对于当前版本的 JavaFX (2.2),您可以
我正在将我的项目从 javafx 1.3 转换为 javafx 2.1。但我对 javafx.lang 有疑问包裹。 最佳答案 JavaFX 1.3 lang 包内容被拆分并移至下一个位置: 时长变为
当我尝试将标签添加到 gridpane 中时,如第二张图片所示,它不起作用。我已经尝试了很多东西,比如添加 CSS,但它仍然无法正常工作。为什么第 113 和 114 行不起作用? (opcje.se
我有一个JavaFX ContextMenu分配给滚动面板的鼠标右键单击。它会打开,但在滚动 Pane 外部单击时不会关闭。我可以在滚动 Pane 中添加另一个鼠标事件以将其隐藏,但这只能解决1个问题
我有一个tableview,其中附有一个可观察到的自定义类对象的列表(类类型:SalesInvoiceNetSale)。该表中的所有数据都可以正常显示。可观察列表中的最后一项是总计行(类类型:Sale
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我想知道如何在JavaFX中绘制半圆。我尝试使用Shape和QuadCurve,但无法制作出完美的半圆。 这是我要绘制的图片: 最佳答案 您链接的图片实际上是一个半圆环。您可以通过绘制嵌套的2条圆弧和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在寻找 JavaFX 支持的图像类型(最新)列表,例如PNG、JPEG、TIFF。不同的搜索引擎没有帮助......知道从哪里开始吗? 更特别的是,我对 16 位灰度图像(不同格式)和罕见的受支持
我希望在 javafx 中让标签每 0.1 秒闪烁一次。文本显示在后台运行的 ImageView gif 的顶部。我将如何去做,或者您对最佳方法有什么建议? 谢谢 最佳答案 @fabian 的解决方案
我需要测试所选项目的值以调用不同的方法,因此我编写了添加侦听器的代码,但是该代码生成语法错误 @FXML private JFXComboBox cmbComp; cmbComp.valuePrope
我正在 Javafx 中编写一个非常简单的应用程序,其中舞台上有一个带有文本框的按钮作为一个场景。现在,我想要的行为是,当我单击按钮时,我可以使用另一个按钮加载另一个场景和舞台上的一个文本框,然后删除
编辑:如果用户单击“删除”以删除 ListView 中的项目,我会弹出一个警告框。它有效,但我希望它能超越原来的舞台。它出现在我的第一台显示器上。有什么方法可以设置警报显示时的位置吗? 请注意,“所有
我想使用 JavaFX 编写一个笔画绘图应用程序。我有一个压敏绘图板,如果能够读取笔的压力和倾斜值,那就太好了。 JavaFX 有一个 API 可以处理鼠标、触摸和滑动输入,但似乎没有任何东西可以产生
我在 JavaFX 中使用条形图和折线图。当我使两个图表大小相同并将它们放在同一位置时,它们完美地相互重叠。我如何使折线图显示在条形图的顶部。 目前我已将它们的不透明度设置为 0.7,这样它们“看起来
此问题与 this 相关。现在我想为字段值等于某个值的行着色。 @FXML private TableView tv_mm_view; @FXML private Ta
我有一个程序,可以生成高度图(0-255 的整数的 2D 数组),并使用 Shape3D“Box”对象为每个“像素”构建 3D View ,其高度与其在高度图中的值成比例。这会创建一个看起来很酷的四四
我想为 JavaFX 创建上下文菜单。这是我测试过的代码。但是由于某种原因,当我右键单击树节点时没有上下文菜单。你能帮我找出我的错误吗。 import java.util.Arrays; import
我是一名优秀的程序员,十分优秀!