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() { 
      public void handle(ActionEvent ae) { 
        response.setText("You pressed Up."); 
      } 
    }); 
 
    // Handle the action events for the Down button. 匿名内部类实现EventHandler接口。
    btnDown.setOnAction(new EventHandler() { 
      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() { 
      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() { 
      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() { 
      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() { 
      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 computerTypes = 
      FXCollections.observableArrayList("Smartphone", "Tablet", "Notebook", 
                                        "Desktop" );  
 
    // Create the list view. 
    ListView lvComputers = new ListView(computerTypes); 
 
    // Set the preferred height and width. 
    lvComputers.setPrefSize(100, 70); 
 
    // Get the list view selection model. 
    MultipleSelectionModel lvSelModel = 
                                     lvComputers.getSelectionModel(); 
 
    // Use a change listener to respond to a change of selection within 
    // a list view. 
    lvSelModel.selectedItemProperty().addListener( 
                                      new ChangeListener() { 
      public void changed(ObservableValue 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() {  
      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() {  
      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() {  
      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();  
  }  
}

你可能感兴趣的:(JavaFX)