暑假第1天,学习JavaFX。
一个简单的程序
首先,创建第一个JavaFx程序:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
public class Program extends Application
{
@Override
public void start( Stage stage )
{
Scene scene = new Scene( new Button( "Hello, World!" ), 300, 220 );
stage.setScene( scene );
stage.setTitle( "My Program" );
stage.show();
}
static void main( String[] args )
{
Application.launch( args );
}
}
程序运行效果:
程序的代码十分清晰:程序的Program类继承自javafx.application.Application,并覆写了其start()方法,当程序开始执行时,虚拟机将会自动调用Application的start()方法,于是程序就开始执行了。
Stage对象其实表示的就是一个窗口,而Scene对象表示场景,所谓场景,也就是说,Scene能指明窗口中需要显示的内容。此外,为了将Scene与Stage联系起来,则需要将Scene对象作为参数,传递给Stage的setScene()方法。既然Scene作为场景,那么就可以往Scene中放置部件(Component)了,所以程序中,在Scene构造的时侯,就为其指定了一个显示文本的按钮部件,并为Scene指定了宽度以及高度。
最后不要忘了执行Scene的show()方法,这样窗口就可以显示出来。
改进一下
上面的程序显得十分的不自然,因为一个按钮占据了整个窗口,原因就是直接将按钮部件放置在Scene中,这样就使得按钮和Scene具有同样的大小。
更多的时候,可以先使用面板(pane)作为其它部件的容器,这样就可以将部件直接放置在面板中,之后再将面板整体放置到Scene中,所以,需要做的就是在面板中指定按钮的大小。这里使用面板来对程序进行改进:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.StackPane;
public class Program extends Application
{
@Override
public void start( Stage stage )
{
StackPane pane = new StackPane();
pane.getChildren().add( new Button( "Hello, World!" ) );
Scene scene = new Scene( pane, 300, 220 );
stage.setScene( scene );
stage.setTitle( "My Program" );
stage.show();
}
}
程序运行效果:
可以看到,按钮以正常的大小显示出来了。通过调用StackPane对象的getChildren()方法,将返回javafx.collections.ObservableList的实例(instance),ObservableList类似于集合类,可以用来存储其它部件元素,因此,可以使用其add()方法来将其它部件加到面板中。StackPane会将加入的部件放置在面板的中央,并且会根据部件的首选大小来显示部件,所以程序中的按钮将以合适的大小显示出来。
注意一下,JavaFX程序中也可以不需要main()方法,这里并没有main()方法,但程序照样也能运行。
最后一点,StackPane即是栈面板,当新的部件加入到StackPane中时,新的部件将放置在原先部件的顶部。例如,在语句
pane.getChildren().add( new Button( "Hello, World!" ) );
之后加上一条语句:
pane.getChildren().add( new Button( "Hello!" ) );
程序的运行效果:
事件处理
为程序增加事件处理的代码,当点击按钮时,会在控制台输出"Hello, World!",可以为按钮设置事件处理器,当按钮被点击时,将会调用事件处理器的handle()方法:
import javafx.application.Application
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.StackPane;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
public class Program extends Application
{
@Override
public void start( Stage stage )
{
Button button = new Button( "Hello, World!" );
button.setOnAction( new EventHandler<ActionEvent>(){
public void handle( ActionEvent event )
{
System.out.println( "Hello, World!" );
}
});
StackPane pane = new StackPane();
pane.getChildren().add( button );
Scene scene = new Scene( pane, 300, 220 );
stage.setScene( scene );
stage.setTitle( "My Program" );
stage.show();
}
}
另外,可以使用lambda表达式来简化代码,例如,将上面的setOnAction()方法的参数改成以下内容:
button.setOnAction( event -> System.out.println( "Hello, World!" ) );