JavaFX

写在之前

以下是《Java8编程入门官方教程》中的一些知识,如有错误,烦请指正。涉及的程序如需下载请移步http://down1.tupwk.com.cn/qhwkdownpage/978-7-302-38738-1.zip

基本概念

JavaFX是Java的下一代GUI框架。其目的就是为了取代Swing。

stage类和scene类

JavaFX采用的核心比喻是舞台。舞台有场景。即舞台是场景的容器。JavaFX至少有一个舞台和一个场景。

Stage是一个顶级容器。,所有JavaFX应用程序自动能够访问一个Stage,叫做主舞台。

Scene是组成场景的元素的容器。

节点和场景图

场景中的单独元素叫做节点,如:命令按钮控件。节点可以由子节点构成,具有子节点的节点称为父节点。根节点是顶级节点。

JavaFX应用程序的骨架

import javafx.application.*; 
import javafx.scene.*; 
import javafx.stage.*; 
import javafx.scene.layout.*; 
 
public class JavaFXSkel extends Application { 
 
  public static void main(String[] args) { 
  
    System.out.println("Launching JavaFX application."); 
  
    // Start the JavaFX application by calling launch(). 
    launch(args);   
  } 
 
  // Override the init() method. 
  public void init() { 
    System.out.println("Inside the init() method."); 
  } 
 
  // Override the start() method. 
  public void start(Stage myStage) { 
 
    System.out.println("Inside the start() method."); 
 
    // Give the stage a title. 
    myStage.setTitle("JavaFX Skeleton."); 
 
    // Create a root node. In this case, a flow layout 
    // is used, but several alternatives exist. 
    FlowPane rootNode = new FlowPane(); 
 
    // Create a scene. 
    Scene myScene = new Scene(rootNode, 300, 200); 
 
    // Set the scene on the stage. 
    myStage.setScene(myScene); 
 
    // Show the stage and its scene. 
    myStage.show(); 
  } 
 
  // Override the stop() method. 
  public void stop() { 
    System.out.println("Inside the stop() method."); 
  } 
}

JavaFX的控件Label

// Demontrate a JavaFX label. 
 
import javafx.application.*; 
import javafx.scene.*; 
import javafx.stage.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
 
public class JavaFXLabelDemo extends Application { 
 
  public static void main(String[] args) { 
 
    // Start the JavaFX application by calling launch(). 
    launch(args);   
  } 
 
  // Override the start() method. 
  public void start(Stage myStage) { 
 
    // Give the stage a title. 
    myStage.setTitle("Use a JavaFX label."); 
 
    // Use a FlowPane for the root node. 
    FlowPane rootNode = new FlowPane(); 
 
    // Create a scene. 
    Scene myScene = new Scene(rootNode, 300, 200); 
 
    // Set the scene on the stage. 
    myStage.setScene(myScene); 
 
    // Create a label. 
    Label myLabel = new Label("JavaFX is a powerful GUI"); 
 
    // Add the label to the scene graph. 
    rootNode.getChildren().add(myLabel); 
 
    // Show the stage and its scene. 
    myStage.show(); 
  } 
}

按钮和事件

// Demonstrate JavaFX events and buttons. 
 
import javafx.application.*; 
import javafx.scene.*; 
import javafx.stage.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.event.*; 
import javafx.geometry.*; 
 
public class JavaFXEventDemo extends Application { 
 
  Label response; 
 
  public static void main(String[] args) { 
 
    // Start the JavaFX application by calling launch(). 
    launch(args);   
  } 
 
  // Override the start() method. 
  public void start(Stage myStage) { 
 
    // Give the stage a title. 
    myStage.setTitle("Use JavaFX Buttons and Events."); 
 
    // Use a FlowPane for the root node. In this case, 
    // vertical and horizontal gaps of 10. 
    FlowPane rootNode = new FlowPane(10, 10); //水平和垂直间隔
 
    // Center the controls in the scene. 
    rootNode.setAlignment(Pos.CENTER); //中间对齐
 
    // Create a scene. 
    Scene myScene = new Scene(rootNode, 300, 100); 
 
    // Set the scene on the stage. 
    myStage.setScene(myScene); 
 
    // Create a label. 
    response = new Label("Push a Button"); 
 
    // Create two push buttons. 
    Button btnUp = new Button("Up"); 
    Button btnDown = new Button("Down"); 
 
    // Handle the action events for the Up button. 
    btnUp.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent ae) { 
        response.setText("You pressed Up."); 
      } 
    }); 
 
    // Handle the action events for the Down button. 匿名内部类实现EventHandler接口。
    btnDown.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent ae) { 
        response.setText("You pressed Down."); 
      } 
    }); 
 
    // Add the label and buttons to the scene graph. 
    rootNode.getChildren().addAll(btnUp, btnDown, response); 
 
    // Show the stage and its scene. 
    myStage.show(); 
  } 
}

CheckBox

import javafx.application.*; 
import javafx.scene.*; 
import javafx.stage.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.event.*; 
import javafx.geometry.*; 
 
public class CheckboxDemo extends Application { 
 
  CheckBox cbSmartphone; 
  CheckBox cbTablet; 
  CheckBox cbNotebook; 
  CheckBox cbDesktop; 
 
  Label response; 
  Label selected; 
 
  String computers; 
 
  public static void main(String[] args) { 
 
    // Start the JavaFX application by calling launch(). 
    launch(args);   
  } 
 
  // Override the start() method. 
  public void start(Stage myStage) { 
 
    // Give the stage a title. 
    myStage.setTitle("Demonstrate Check Boxes"); 
 
    // Use a vertical FlowPane for the root node. In this case, 
    // vertical and horizontal gaps of 10. 
    FlowPane rootNode = new FlowPane(Orientation.VERTICAL, 10, 10); 
 
    // Center the controls in the scene. 
    rootNode.setAlignment(Pos.CENTER); 
 
    // Create a scene. 
    Scene myScene = new Scene(rootNode, 230, 200); 
 
    // Set the scene on the stage. 
    myStage.setScene(myScene); 
 
    Label heading = new Label("What Computers Do You Own?"); 
 
    // Create a label that will report the state change of a check box. 
    response = new Label(""); 
 
    // Create a label that will report all selected check boxes. 
    selected = new Label(""); 
 
    // Create the check boxes. 
    cbSmartphone = new CheckBox("Smartphone"); 
    cbTablet = new CheckBox("Tablet"); 
    cbNotebook = new CheckBox("Notebook"); 
    cbDesktop = new CheckBox("Desktop"); 
 
    // Handle action events for the check boxes. 
    cbSmartphone.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent ae) { 
        if(cbSmartphone.isSelected()) 
          response.setText("Smartphone was just selected."); 
        else 
          response.setText("Smartphone was just cleared."); 
 
        showAll(); 
      } 
    }); 
 
    cbTablet.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent ae) { 
        if(cbTablet.isSelected()) 
          response.setText("Tablet was just selected."); 
        else 
          response.setText("Tablet was just cleared."); 
 
        showAll(); 
      } 
    }); 
 
    cbNotebook.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent ae) { 
        if(cbNotebook.isSelected()) 
          response.setText("Notebook was just selected."); 
        else 
          response.setText("Notebook was just cleared."); 
 
        showAll(); 
      } 
    }); 
 
    cbDesktop.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent ae) { 
        if(cbDesktop.isSelected()) 
          response.setText("Desktop was just selected."); 
        else 
          response.setText("Desktop was just cleared."); 
 
        showAll(); 
      } 
    }); 
 
    // Add controls to the scene graph. 
    rootNode.getChildren().addAll(heading, cbSmartphone, cbTablet, 
                                  cbNotebook, cbDesktop, response, selected); 
 
    // Show the stage and its scene. 
    myStage.show(); 
 
    showAll(); 
  } 
 
  // Update and show the selections. 
  void showAll() { 
    computers = ""; 
    if(cbSmartphone.isSelected()) computers = "Smartphone "; 
    if(cbTablet.isSelected()) computers += "Tablet "; 
    if(cbNotebook.isSelected()) computers += "Notebook "; 
    if(cbDesktop.isSelected()) computers += "Desktop"; 
 
    selected.setText("Computers selected: " + computers); 
  } 
}

ListView

// Demonstrate a list view. 
 
import javafx.application.*; 
import javafx.scene.*; 
import javafx.stage.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.geometry.*; 
import javafx.beans.value.*; 
import javafx.collections.*; 
 
public class ListViewDemo extends Application { 
 
  Label response; 
 
  public static void main(String[] args) { 
 
    // Start the JavaFX application by calling launch(). 
    launch(args);   
  } 
 
  // Override the start() method. 
  public void start(Stage myStage) { 
 
    // Give the stage a title. 
    myStage.setTitle("ListView Demo"); 
 
    // Use a FlowPane for the root node. In this case, 
    // vertical and horizontal gaps of 10. 
    FlowPane rootNode = new FlowPane(10, 10); 
 
    // Center the controls in the scene. 
    rootNode.setAlignment(Pos.CENTER); 
 
    // Create a scene. 
    Scene myScene = new Scene(rootNode, 200, 120); 
 
    // Set the scene on the stage. 
    myStage.setScene(myScene); 
 
    // Create a label. 
    response = new Label("Select Computer Type"); 
 
    // Create an ObservableList of entries for the list view. 
    ObservableList<String> computerTypes = 
      FXCollections.observableArrayList("Smartphone", "Tablet", "Notebook", 
                                        "Desktop" );  
 
    // Create the list view. 
    ListView<String> lvComputers = new ListView<String>(computerTypes); 
 
    // Set the preferred height and width. 
    lvComputers.setPrefSize(100, 70); 
 
    // Get the list view selection model. 
    MultipleSelectionModel<String> lvSelModel = 
                                     lvComputers.getSelectionModel(); 
 
    // Use a change listener to respond to a change of selection within 
    // a list view. 
    lvSelModel.selectedItemProperty().addListener( 
                                      new ChangeListener<String>() { 
      public void changed(ObservableValue<? extends String> changed, 
                          String oldVal, String newVal) { 
 
        // Display the selection. 
        response.setText("Computer selected is " + newVal); 
      } 
    }); 
 
    // Add the label and list view to the scene graph. 
    rootNode.getChildren().addAll(lvComputers, response); 
 
    // Show the stage and its scene. 
    myStage.show(); 
  } 
}

TextField

// Demonstrate a text field. 
 
import javafx.application.*; 
import javafx.scene.*; 
import javafx.stage.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.event.*; 
import javafx.geometry.*; 
 
public class TextFieldDemo extends Application { 
 
  TextField tf; 
  Label response; 
 
  public static void main(String[] args) { 
 
    // Start the JavaFX application by calling launch(). 
    launch(args);   
  } 
 
  // Override the start() method. 
  public void start(Stage myStage) { 
 
    // Give the stage a title. 
    myStage.setTitle("Demonstrate a TextField"); 
 
    // Use a FlowPane for the root node. In this case, 
    // vertical and horizontal gaps of 10. 
    FlowPane rootNode = new FlowPane(10, 10); 
 
    // Center the controls in the scene. 
    rootNode.setAlignment(Pos.CENTER); 
 
    // Create a scene. 
    Scene myScene = new Scene(rootNode, 230, 140); 
 
    // Set the scene on the stage. 
    myStage.setScene(myScene); 
 
    // Create a label that will report the state of the 
    // selected check box. 
    response = new Label("Enter Name: "); 
 
    // Create a button that gets the text. 
    Button btnGetText = new Button("Get Name"); 
 
    // Create a text field. 
    tf = new TextField(); 
 
    // Set the prompt. 
    tf.setPromptText("Enter a name."); 
 
    // Set preferred column count. 
    tf.setPrefColumnCount(15); 
 
    // Use a lambda expression to handle action events for the 
    // text field. Action events are generated when ENTER is 
    // pressed while the text field has input focus. In this case, 
    // the text in the field is obtained and displayed. 
    tf.setOnAction( (ae) -> response.setText("Enter pressed. Name is: " + 
                                             tf.getText())); 
 
    // Use a lambda expression to get text from the text field 
    // when the button is pressed. 
    btnGetText.setOnAction((ae) -> 
                            response.setText("Button pressed. Name is: " + 
                                             tf.getText())); 
 
    // Use a separator to better organize the layout. 
    Separator separator = new Separator(); 
    separator.setPrefWidth(180); 
 
    // Add controls to the scene graph. 
    rootNode.getChildren().addAll(tf, btnGetText, separator, response); 
 
    // Show the stage and its scene. 
    myStage.show(); 
  } 
}

效果和变换

// Demonstrate rotation, scaling, reflection, and bluring. 
  
import javafx.application.*;  
import javafx.scene.*;  
import javafx.stage.*;  
import javafx.scene.layout.*;  
import javafx.scene.control.*;  
import javafx.event.*;  
import javafx.geometry.*;  
import javafx.scene.transform.*; 
import javafx.scene.effect.*; 
import javafx.scene.paint.*; 
  
public class EffectsAndTransformsDemo extends Application {  
  
  double angle = 0.0; 
  double scaleFactor = 0.4; 
  double blurVal = 1.0; 
 
  // Create initial effects and transforms. 
  Reflection reflection = new Reflection(); 
  BoxBlur blur = new BoxBlur(1.0, 1.0, 1); 
  Rotate rotate = new Rotate(); 
  Scale scale = new Scale(scaleFactor, scaleFactor); 
 
  // Create push buttons.  
  Button btnRotate = new Button("Rotate");  
  Button btnBlur = new Button("Blur off"); 
  Button btnScale = new Button("Scale"); 
 
  Label reflect = new Label("Reflection Adds Visual Sparkle"); 
 
  public static void main(String[] args) {  
  
    // Start the JavaFX application by calling launch().  
    launch(args);    
  }  
  
  // Override the start() method.  
  public void start(Stage myStage) {  
  
    // Give the stage a title.  
    myStage.setTitle("Effects and Transforms Demo");  
  
    // Use a FlowPane for the root node. In this case,  
    // vertical and horizontal gaps of 20 are used. 
    FlowPane rootNode = new FlowPane(20, 20);  
  
    // Center the controls in the scene.  
    rootNode.setAlignment(Pos.CENTER);  
  
    // Create a scene.  
    Scene myScene = new Scene(rootNode, 300, 120);  
  
    // Set the scene on the stage.  
    myStage.setScene(myScene);  
 
    // Add rotation to the transform list for the Rotate button. 
    btnRotate.getTransforms().add(rotate);  
 
    // Add scaling to the transform list for the Scale button. 
    btnScale.getTransforms().add(scale); 
 
    // Set the reflection effect on the reflection label. 
    reflection.setTopOpacity(0.7); 
    reflection.setBottomOpacity(0.3); 
    reflect.setEffect(reflection); 
 
    // Handle the action events for the Rotate button.  
    btnRotate.setOnAction(new EventHandler<ActionEvent>() {  
      public void handle(ActionEvent ae) {  
        // Each time button is pressed, it is rotated 30 degrees 
        // around its center. 
        angle += 15.0; 
 
        rotate.setAngle(angle);        
        rotate.setPivotX(btnRotate.getWidth()/2); 
        rotate.setPivotY(btnRotate.getHeight()/2); 
      }  
    });  
  
    // Handle the action events for the Scale button.  
    btnScale.setOnAction(new EventHandler<ActionEvent>() {  
      public void handle(ActionEvent ae) {  
        // Each time button is pressed, the button's scale is changed. 
        scaleFactor += 0.1; 
        if(scaleFactor > 2.0) scaleFactor = 0.4; 
 
        scale.setX(scaleFactor); 
        scale.setY(scaleFactor);         
 
      }  
    });  
 
    // Handle the action events for the Blur button. 
    btnBlur.setOnAction(new EventHandler<ActionEvent>() {  
      public void handle(ActionEvent ae) {  
        // Each time button is pressed, its blur status is changed. 
        if(blurVal == 10.0) { 
          blurVal = 1.0; 
          btnBlur.setEffect(null); 
          btnBlur.setText("Blur off"); 
        } else { 
          blurVal++; 
          btnBlur.setEffect(blur);  
          btnBlur.setText("Blur on"); 
        } 
        blur.setWidth(blurVal); 
        blur.setHeight(blurVal); 
      }  
    });  
 
    // Add the label and buttons to the scene graph.  
    rootNode.getChildren().addAll(btnRotate, btnScale, btnBlur, reflect);  
 
    // Show the stage and its scene.  
    myStage.show();  
  }  
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容