JavaFX学习之Control

  Control
Control类控件通常由Control,Skin,Behavior3个类组成,其中Skin用于排版布局也就是rendering。
setContextMenu(ContextMenu value)设置邮件菜单
setHeight(double value)
setWidth(double value)
setMaxHeight(double value)
setMaxSize(double maxWidth, double maxHeight)
setMaxWidth(double value)
setMinHeight(double value)
setMinSize(double minWidth, double minHeight)
setMinWidth(double value)
setPrefHeight(double value)
setPrefSize(double prefWidth, double prefHeight)
setPrefWidth(double value)
实际,最大,最小,优先选择
setSkin(Skin<?> value)
setSkinClassName(java.lang.String skinClassName) 指定皮肤
setTooltip(Tooltip value)
resize(double width, double height) 在父类布局的时候调用,控制control的大小

  Button
Button button = new Button();
button.setText("Click");
button.setGraphic(new ImageView(image));
Button button2 = new Button("Click");
button2.setGraphic(new ImageView(image));
Button button3 = new Button("Click",new ImageView(image));
button3.setContentDisplay(ContentDisplay.LEFT);

三个构造方法,二个参数一个是名字,另一个是图标。control类的基本上都有图标
通过setContentDisplay控制文字和图标的位置
方法
setCancelButton
setDefaultButton

  ToggleButton
public void init(Group root){
		ToggleGroup tg = new ToggleGroup();
		ToggleButton tb1 = new ToggleButton("one");
		tb1.setToggleGroup(tg);
		tb1.setSelected(true);
		ToggleButton tb2 = new ToggleButton("two");
		tb2.setToggleGroup(tg);
		ToggleButton tb3 = new ToggleButton("three");
		tb3.setToggleGroup(tg);
		HBox box = new HBox(20);
		box.getChildren().addAll(tb1,tb2,tb3);
		box.setFillHeight(true);
		box.setLayoutX(200);
		box.setLayoutY(300);
		root.getChildren().addAll(box);
}

关联的Button, 通过设置setToggleGroup,把几个ToggleButton放在一组,这样就只有一个能选中。
选中设置setSelected。
一般通过ToggleGroup的selectedToggleProperty去监听toggleButton的变动。
tg.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {

			@Override
			public void changed(ObservableValue<? extends Toggle> observable,
					Toggle oldValue, Toggle newValue) {
				
			}
			
});


   RadioButton
public void init(Group root) {
        RadioButton rb1 = new RadioButton();
        RadioButton rb2 = new RadioButton();
        RadioButton rb3 = new RadioButton();
        ToggleGroup tg = new ToggleGroup();
        rb1.setToggleGroup(tg);
        rb2.setToggleGroup(tg);
        rb3.setToggleGroup(tg);
        HBox box = new HBox(20);
	box.getChildren().addAll(rb1,rb2,rb3);
	box.setFillHeight(true);
	box.setLayoutX(200);
	box.setLayoutY(300);
	root.getChildren().addAll(box);
}

用法和ToggleButton一样

  CheckBox
public void init(HBox root){
		CheckBox checkBox = new CheckBox();
                  checkBox.setSelected(true);
		CheckBox checkBox2 = new CheckBox();
		checkBox2.setIndeterminate(true);
		CheckBox checkBox3 = new CheckBox();
		checkBox3.setAllowIndeterminate(true);
		root.setAlignment(Pos.CENTER);
		root.getChildren().addAll(checkBox,checkBox2,checkBox3);
}

setIndeterminate(true);设置不确定符号,也就是checkbook一出来就显示一个横杠。若没有设置setAllowIndeterminate(true),则只初始化时候有,继续点不出现。
checkBox.setAllowIndeterminate(true);允许不确定符号出现在点击的时候,出了空和勾外,还允许横杠出现。

  ChoiceBox
ChoiceBox<String> cb = new ChoiceBox<String>();
cb.getItems().addAll("a","b","c");
其它方法
setConverter(StringConverter<T> value)
setValue(T value)
show()
hide()
  ComboBox
private final ObservableList<String> strings = FXCollections.observableArrayList(
	            "Option 1", "Option 2", "Option 3",
	            "Option 4", "Option 5", "Option 6",
	            "Option 7", "Option 8", "Option 9",
	            "Option 10", "Option 1222222222222222222");
public void init(HBox root){
		ComboBox<String> cb = new ComboBox<String>();
		cb.setPromptText("select");
		cb.getItems().addAll(strings);
		ComboBox<String> cb2 = new ComboBox<String>();
		cb2.setPromptText("select or edit");
		cb2.getItems().addAll(strings);
		cb2.setEditable(true);
		root.setAlignment(Pos.CENTER);
		root.getChildren().addAll(cb,cb2);
}

组合下拉框
setEditable(true)则可以编辑
框的大小是按最大长度的值去算的
setPromptText默认内容

  ContextMenu
final ContextMenu contextMenu = new ContextMenu();
		MenuItem item1 = new MenuItem("About");
		MenuItem item2 = new MenuItem("Preferences");
		contextMenu.getItems().addAll(item1, item2);
		final TextField textField = new TextField("Type Something");
		textField.setContextMenu(contextMenu);
		textField.setOnAction(new EventHandler<ActionEvent>() {
		    public void handle(ActionEvent e) {
		        contextMenu.show(textField, Side.BOTTOM, 0, 0);
		    }
		});

上下文菜单,一般用于右键点击,但一些node本身就已经由ContextMenu,所以会都出现。
show(Node anchor, double screenX, double screenY)
show(Node anchor, Side side, double dx, double dy)
主动展示,控制位置

  Hyperlink
  Label and Labeled
setLabelFor(Node value)??
labeled一些方法
setEllipsisString(java.lang.String value)设置省略号,但text的内容不能完全显示时,后面加指定的省略值。
setGraphicTextGap(double value)设置graphic和text之间的间隙
setMnemonicParsing(boolean value)
setTextFill(Paint value)设置文字颜色
setTextOverrun(OverrunStyle value) 设置text超出范围后处理策略,默认用省略策略
setUnderline(boolean value)设置下划线
setWrapText(boolean value) 设置是否换行
getContentBias() 当text换行,这是此值为HORIZONTAL,否则为空
  ListView
  MenuBar and Menu and MenuItem
MenuBar menuBar = new MenuBar();
		Menu menu = new Menu("File");
		Menu newMenu = new Menu("new");
		MenuItem javaItem = new MenuItem("Java Project");
		newMenu.getItems().add(javaItem);
		MenuItem openItem = new MenuItem("open");
		openItem.setAccelerator(KeyCombination.keyCombination("Ctrl+O"));
		openItem.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent event) {
				// TODO Auto-generated method stub
				FileChooser fc = new FileChooser();
				fc.showOpenDialog(stage);
			}
		});
		MenuItem closeItem = new MenuItem("close");
	    CheckMenuItem filterItem = new CheckMenuItem("filter");
		menu.getItems().addAll(newMenu,openItem,new SeparatorMenuItem(),closeItem,filterItem);
		menuBar.getMenus().add(menu);

一般菜单栏通过MenuBar添加Menu,menu里面可以添加menu(二级菜单)和menuItem。menuItem为最小单位了。
menuBar.getMenus().add(menu);
menu.getItems().add(menuItem);
设置快捷键
除了MenuItem外,还有CheckMenuItem等Node,方便使用。
其它方法
Menu
show()展现菜单,初始化的时候调这个没用,一般通过其它事件去调用这个方法去展示菜单
MenuBar
setUseSystemMenuBar(boolean value)使用系统提供的Bar,若平台支持

  Pagination
 Pagination pagination = new Pagination(10, 0);
		pagination.setPrefWidth(300);
		pagination.setPageFactory(new Callback<Integer, Node>() {
			public Node call(Integer pageIndex) {
				VBox box = new VBox(5);
				Hyperlink link = new Hyperlink(myurls[pageIndex]);
				box.getChildren().add(link);
				return box;
			}
		});
pagination.currentPageIndexProperty().addListener(new ChangeListener<Number>() {

			@Override
			public void changed(ObservableValue<? extends Number> observable,
					Number oldValue, Number newValue) {
				System.out.println(newValue);
				System.out.println(myurls[newValue.intValue()]);
			}
			
		});

分页,通过setPageFactory构造每页的值。
构造函数总共页数,当前页数
其它方法
setMaxPageIndicatorCount(int value)设置当前展示页数的最大值,默认可以展示10个
  PasswordField
  PopupControl
  RadioButton
  ProgressBar and ProgressIndicator
		ProgressBar pb = new ProgressBar();
		pb.setPrefSize(200, 20);
		pb.setLayoutX(50);
		pb.setLayoutY(50);
		
		ProgressBar pb2 = new ProgressBar();
		pb2.setPrefSize(200, 20);
		pb2.setLayoutX(50);
		pb2.setLayoutY(100);
		pb2.setProgress(0);
		
		ProgressBar pb3 = new ProgressBar();
		pb3.setPrefSize(200, 20);
		pb3.setLayoutX(50);
		pb3.setLayoutY(150);
		pb3.setProgress(0.5);
		
		ProgressBar pb4 = new ProgressBar();
		pb4.setPrefSize(200, 20);
		pb4.setLayoutX(50);
		pb4.setLayoutY(150);
		pb4.progressProperty().bind(dp);
		
		Timeline timeline = new Timeline();
		KeyFrame kf = new KeyFrame(Duration.millis(100),new EventHandler<ActionEvent>(){
			@Override
			public void handle(ActionEvent event) {
				if(dp.get()<1){
					dp.set(dp.get()+0.05);
				}else{
					dp.set(0);
				}
			}
		});
		timeline.getKeyFrames().add(kf);
		timeline.setCycleCount(Timeline.INDEFINITE);
                  ProgressIndicator pi = new ProgressIndicator();
		pi.setLayoutY(250);
		root.getChildren().addAll(pb,pb2,pb3,pb4);
		timeline.play();

关键的就是progress的值,此值改变进度值,一般是通过binding。进度值小于0是一直在闪,0到1是具体的进度,大于等于1都是满的。
ProgressIndicator  只是变成了原形的进度条。
   ScrollBar
引用

ScrollBar sb = new ScrollBar();
sb.setOrientation(Orientation.HORIZONTAL);
root.getChildren().add(sb);

和ScrollPane不同,要控制的Node与ScrollBar之间没有什么联系,只能通过计算ScrollBar的移动去计算要控制的Node。
需要手动设置是水平,还是竖直
setUnitIncrement(double value) 设置单元增长
setValue(double value) 设置当前值
setVisibleAmount(double value) 设置可见的bar的范围,也就是那可移动的条条的长度。
setMax(double value)
setMin(double value) 设置value的最大最小值
  ScrollPane
Rectangle rect = new Rectangle(200, 200);
		 Stop start = new Stop(0,Color.BLACK);
		 Stop end = new Stop(1,Color.WHITE);
		 Stop[] stops = {start,end};
		 LinearGradient lg = LinearGradientBuilder.create().startX(0).endX(1).stops(stops).build();
		 rect.setFill(lg);
		 ScrollPane s1 = new ScrollPane();
		 s1.setPrefSize(150, 150);
		 s1.setContent(rect);
		 Rectangle rect2 = new Rectangle(200, 600);
		 rect2.setFill(lg);
		 final ScrollPane s2 = new ScrollPane();
		 s2.setPrefSize(150, 300);
		 s2.setContent(rect2);
		 s2.setLayoutX(250);
		 s2.setHbarPolicy(ScrollBarPolicy.NEVER);
		 s2.setVmax(1000);
                   s2.setVmin(200);		 
		 s2.vvalueProperty().addListener(new ChangeListener<Number>() {

			@Override
			public void changed(ObservableValue<? extends Number> observable,
					Number oldValue, Number newValue) {
                       System.out.println(newValue);				
			}
		});
		Button button = new Button("Click");
		button.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent event) {
				s2.setVvalue(500);
				
			}
		});
		button.setLayoutY(500);

ScrollPane主要控制的就是HBar和VBar
设置Bar出现的策略,有一直有,需要的时候有,一直没有
通过控制Hvalue和Vvalue控制显示的位置, value值一般是从0到1,设置最小值和最大值,则value便从min到max。

其它的一些方法
setFitToHeight(boolean value)为true若它的子节点大小可以变化,则子节点的高度变成和scrollpane的高度一样,若不可以变化忽略此值。
setPannable(boolean value)
setPrefViewportHeight(double value)
setViewportBounds(Bounds value) 

  Separator
Text text1 = new Text("a");
		Text text2 = new Text("b");
		Separator s = new Separator();
		s.setPrefWidth(50);
		s.setOrientation(Orientation.VERTICAL);
		s.setHalignment(HPos.RIGHT);

分割线,设置方向和位置
  SplitPane
		SplitPane sp = new SplitPane();
		sp.setPrefSize(600,600);
		sp.setOrientation(Orientation.VERTICAL);
		final StackPane sp1 = new StackPane();
		sp1.getChildren().add(new Button("Button One"));
		final StackPane sp2 = new StackPane();
		sp2.getChildren().add(new Button("Button Two"));
		final StackPane sp3 = new StackPane();
		sp3.getChildren().add(new Button("Button Three"));
		sp.getItems().addAll(sp1, sp2, sp3);
		sp.setDividerPositions(0.1f, 0.3f, 0.6f);

setOrientation(Orientation value) 设置是水平还是竖直分。
setDividerPositions(double... positions) 设置分割的大小,0.0到1.0。
setDividerPosition(int dividerIndex, double position) 设置分割的大小
基本上就这二个方法
  TabPane and Tab
    TabPane tabPane = new TabPane();
		tabPane.setPrefSize(600, 600);
		Tab tab1 = new Tab();
		tab1.setText("tab1");
		Text text = new Text("tab1");
		text.setTranslateX(100);
		tab1.setContent(text);
		Tab tab2 = new Tab("tab2");
		Text text2 = new Text("tab2");
		tab2.setContent(text2);
		tab2.setClosable(false);
		Tab tab3 = new Tab("tab3");
		tab3.setDisable(true);
		Tab tab4 = new Tab("tab4");
		ContextMenu cm = new ContextMenu();
		MenuItem mi = new MenuItem("About");
		cm.getItems().add(mi);
		tab4.setContextMenu(cm);
		tab4.setClosable(false);
		Tab tab5 = new Tab("tab5");
                  tab5.setTooltip(new Tooltip("Don't close it"));
                  tab6.setOnClosed(new EventHandler<Event>() {
			@Override
			public void handle(Event event) {
				System.out.println("close");
			}
		});
        tab6.setOnSelectionChanged(new EventHandler<Event>() {
			@Override
			public void handle(Event event) {
				System.out.println("tab6  changed");
			}
		});
        tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {

			@Override
			public void changed(ObservableValue<? extends Tab> observable,
					Tab oldValue, Tab newValue) {
				System.out.println(newValue.getText());
				
			}
        	
		});
        tabPane.getTabs().addAll(tab1,tab2,tab3,tab4,tab5,tab6);

Control可以设置大小。
子节点的位置由父节点控制,所以子节点只能用translate控制位置。
设置close按钮是否可用,设置disable是否tab可点,设置ContextMenu右击菜单,设置Tooltip提示信息(鼠标移上去提示)。
可用设置close事件,和selection事件(选中和离开)。
若对所有选中tab进行处理,可用使用tabpane来做,基本上每一个父类加点都要这种事件处理如tableView,treeView,都是获取选中的Model,然后获取选中ItemProperty,在上面加item改变事件。注意的是刚加载的时候默认的item为新的item,但是没有旧的item,此时它为空。其实可用换一种想法,addListener事件针对所有的property,只要你观察哪个property符合你的要求,就可用对上面加事件,从而获取你所要的。

其它方法
setUserData(java.lang.Object value)设置用户数据,可用把一些数据存储在这里,然后在需要的时候拿过来用。

tabPane的方法
setRotateGraphic(boolean value)设置tab的graphic是否可旋转
setSide(Side value) 设置tab栏的显示位置
setTabClosingPolicy(TabPane.TabClosingPolicy value)设置Close按钮的政策,所有的有,只有选中时有,都没有
setTabMaxHeight(double value)
setTabMaxWidth(double value)
setTabMinHeight(double value)
setTabMinWidth(double value) 设置Tab的最大最小size

  TextArea
		TextArea ta = new TextArea("abdc");
		ta.setPrefSize(200, 200);
		final TextArea ta2 = new TextArea();
		ta2.setPrefColumnCount(10);  //设置列
		ta2.setPrefRowCount(10);     //设置行
		ta2.setLayoutY(300);
		Button button = new Button("Click");
		button.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				ta2.setScrollLeft(30);  //设置水平滚动条的值
				
			}
		});
		button.setLayoutY(580);


  TextField and TextInputControl
TextField tf = new TextField();
tf.setAlignment(Pos.CENTER);
TextField tf1 = new TextField();
tf1.setPrefColumnCount(10);
方法
setPrefColumnCount设置优先的column数量,用于计算textField长度
getCharacters() 获取输入的字符串
TextInputControl一些方法
TextField tf2 = new TextField();
		tf2.setEditable(false);
		tf2.setLayoutX(300);
		TextField tf3 = new TextField();
		tf3.setLayoutY(100);
		tf3.setPromptText("please click");
                  tf3.setOnMouseReleased(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent event) {
				tf3.deletePreviousChar();
			}
		});

设置是否可编辑,设置提示内容。
copy()赋值选中的值
paste()粘贴
cut()
deleteNextChar() 删除当前位置的下一个值,有选中的话,删除选中值
deletePreviousChar() 删除当前位置的前一个值,有选中的话,删除选中值
deleteText(IndexRange range) 按规则来删
deselect() 清除选中,并不删掉选中内容
clear()清楚text里面内容
insertText(int index, java.lang.String text)往指定的位置插入text
selectPreviousWord()选择光标之前的内容
selectNextWord()选中光标后的内容
selectEndOfNextWord()
selectAll()选中所有
selectHome()选择光标到home
selectEnd()选择光标到end
selectPositionCaret(int pos)
selectRange(int anchor,int caretPosition)

nextWord()把光标移到最后 ??
endOfNextWord()??
home()光标移动到最前
end()光标移动到最后
forward()光标向前移一下
backward()光标向后移一下
extendSelection(int pos)???
replaceSelection(java.lang.String replacement)

  TitledPane
TitledPane t1 = new TitledPane();
		  t1.setPrefWidth(50);
		  t1.setText("select");
		  t1.setAlignment(Pos.CENTER);
		  t1.setExpanded(false);
		  ListView<String> lv = new ListView<String>();
		  lv.getItems().addAll("a","b","C");
		  t1.setContent(lv);
		  
		  TitledPane t2 = new TitledPane("select",new Text("a"));
		  t2.setPrefWidth(50);
		  t2.setCollapsible(false);
		  
		  TitledPane t3 = new TitledPane("select",new Text("a"));
		  t3.setPrefWidth(50);
		  t3.setAnimated(false);

有点像下拉框,titledPane本身没什么方法,都是继承labeledPane。
setExpanded设置默认是否展开
setCollapsible设置有没有展开的功能
setAnimated设置展开时的动画,为false则展开的node直接出现,没有动画效果
  ToolBar
ToolBar toolBar = new ToolBar(
			     new Button("New"),
			     new Button("Open"),
			     new Button("Save"),
			     new Separator(),
			     new Button("Clean"),
			     new Button("Compile"),
			     new Button("Run"),
			     new Separator(),
			     new Button("Debug"),
			     new Button("Profile")
			 );
		toolBar.setOrientation(Orientation.VERTICAL);

常用的工具条,本身没什么方法,就一个设置方向的。
  Tooltip
 Button button = new Button("Hover Over Me");
		 button.setTooltip(new Tooltip("Tooltip for Button"));
		 Rectangle rect = new Rectangle(0, 0, 100, 100);
		 Tooltip t = new Tooltip("A Square");
		 Tooltip.install(rect, t);
		 root.getChildren().addAll(button,rect);

可以直接在节点上设置tooltip,或者是用tooltip的install方法与节点关联
其它方法
setContentDisplay(ContentDisplay value) 设置图标相对于文字的位置
isActivated()由于延迟可能还没显示,此时active为false
  [b][/b]


这里有很多javafx的小游戏,一个高手写的
http://lustrezhang.gotoip4.com/fxgame/

这里有个javafx学习的中文网站,我把内容都丢那上面去了。
http://www.jfxee.com/

你可能感兴趣的:(JavaFX,control)