JavaFX

寫在之前

以下是《Java8編程入門官方教程》中的一些知識(shí)澄干,如有錯(cuò)誤分唾,煩請(qǐng)指正。涉及的程序如需下載請(qǐng)移步http://down1.tupwk.com.cn/qhwkdownpage/978-7-302-38738-1.zip

基本概念

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

stage類和scene類

JavaFX采用的核心比喻是舞臺(tái)酪捡。舞臺(tái)有場(chǎng)景。即舞臺(tái)是場(chǎng)景的容器纳账。JavaFX至少有一個(gè)舞臺(tái)和一個(gè)場(chǎng)景逛薇。

Stage是一個(gè)頂級(jí)容器。疏虫,所有JavaFX應(yīng)用程序自動(dòng)能夠訪問(wèn)一個(gè)Stage永罚,叫做主舞臺(tái)。

Scene是組成場(chǎng)景的元素的容器卧秘。

節(jié)點(diǎn)和場(chǎng)景圖

場(chǎng)景中的單獨(dú)元素叫做節(jié)點(diǎn)呢袱,如:命令按鈕控件。節(jié)點(diǎn)可以由子節(jié)點(diǎn)構(gòu)成斯议,具有子節(jié)點(diǎn)的節(jié)點(diǎn)稱為父節(jié)點(diǎn)产捞。根節(jié)點(diǎn)是頂級(jí)節(jié)點(diǎn)。

JavaFX應(yīng)用程序的骨架

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); //中間對(duì)齊
 
    // 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. 匿名內(nèi)部類實(shí)現(xiàn)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();  
  }  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坯临,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恋昼,更是在濱河造成了極大的恐慌看靠,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件液肌,死亡現(xiàn)場(chǎng)離奇詭異挟炬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嗦哆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門谤祖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人老速,你說(shuō)我怎么就攤上這事粥喜。” “怎么了橘券?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵额湘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我旁舰,道長(zhǎng)锋华,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任箭窜,我火速辦了婚禮毯焕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磺樱。我一直安慰自己纳猫,他們只是感情好紧阔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著续担,像睡著了一般。 火紅的嫁衣襯著肌膚如雪活孩。 梳的紋絲不亂的頭發(fā)上物遇,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音憾儒,去河邊找鬼询兴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛起趾,可吹牛的內(nèi)容都是我干的诗舰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼训裆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼眶根!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起边琉,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤属百,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后变姨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族扰,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年定欧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渔呵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砍鸠,死狀恐怖扩氢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睦番,我是刑警寧澤类茂,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站托嚣,受9級(jí)特大地震影響巩检,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜示启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一兢哭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夫嗓,春花似錦迟螺、人聲如沸冲秽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锉桑。三九已至,卻和暖如春窍株,著一層夾襖步出監(jiān)牢的瞬間民轴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工球订, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留后裸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓冒滩,卻偏偏與公主長(zhǎng)得像微驶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子开睡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容