import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.effect.DropShadow; import javafx.scene.effect.Effect; import javafx.scene.effect.Glow; import javafx.scene.effect.SepiaTone; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.KeyCombination; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.TextAlignment; import javafx.stage.Stage; import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry; public class CheckMenuItemTest extends Application { final PageData[] pages = new PageData[]{ new PageData("标题一", "描述一", "名称一"), new PageData("标题二", "描述二", "名称二"), new PageData("标题三", "描述三", "名称三"), new PageData("标题", "描述", "名称") }; final String[] viewOptions = new String[]{ "标题", "二项式", "图片", "描述" }; final Entry<String, Effect>[] effects = new Entry[]{//Entry类型数组对象的初始化 new SimpleEntry<>("Sepia Tone", new SepiaTone()),//创建一个深褐色特效 new SimpleEntry<>("Glow", new Glow()),//创建一个发光特效 new SimpleEntry<>("Shadow", new DropShadow())//创建一个阴影特效 }; final ImageView pic = new ImageView();//创建视图显示区域 final Label name = new Label();//创建标签对象 final Label binName = new Label();//创建标签对象 final Label description = new Label();//创建标签对象 private int currentIndex = -1;//当前下标值的初始化设置 public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { stage.setTitle("Menu例子"); Scene scene = new Scene(new VBox(), 400, 350);//设置场景宽度和高度 scene.setFill(Color.DARKBLUE);//场景填充颜色 name.setFont(new Font("Verdana Bold", 22));//设置标签字体 binName.setFont(new Font("Arial Italic", 20));//设置标签字体 pic.setFitHeight(150);//图片设置固定高度 pic.setPreserveRatio(true);//图片设置保留比例 description.setWrapText(true);//标签文字包围特效设置 description.setTextAlignment(TextAlignment.JUSTIFY);//设置label标签的对齐方式 shuffle();//清晰复原程序 MenuBar menuBar = new MenuBar();//创建一个MenuBar对象,以后Menu类型对象需要镶嵌到这个MenuBar对象的上面 final VBox vbox = new VBox();//创建一个垂直布局对象 vbox.setAlignment(Pos.CENTER);//设置vbox对象对齐方式 vbox.setSpacing(10);//设置vbox对象布局的元素之间的空间距离 vbox.setPadding(new Insets(0, 10, 0, 10));//设置Vbox对象内边距 vbox.getChildren().addAll(name, binName, pic, description);//vbox布局器中要添加的被布局元素对象(用vbox对象布局相关Node类型Label标签型对象) // --- Menu File Menu menuFile = new Menu("菜单一"); MenuItem add = new MenuItem("切换内容", new ImageView(new Image("https://profile.csdnimg.cn/B/F/8/3_zy103118")));//创建一个MenuItem类型对象其背景设置为一个图片 add.setOnAction((ActionEvent t) -> {//MenuItem类型对象添加点击事件处理程序回调函数 shuffle(); vbox.setVisible(true); }); MenuItem clear = new MenuItem("清除内容");//创建一个MenuItem选项组件 clear.setAccelerator(KeyCombination.keyCombination("Ctrl+E"));//Accelerator加速器引申意义为快捷方式:将名为clear的MenuItem对象的访问快捷方式设置为Ctrl+E组合键 clear.setOnAction((ActionEvent t) -> {//设置名称为clear的MenuItem对象的交互事件处理回调函数 vbox.setVisible(false);//设置vbox对象的可见性为Visible为false,则vbox对象就不可见了 }); MenuItem exit = new MenuItem("Exit"); exit.setOnAction((ActionEvent t) -> { System.exit(0); }); menuFile.getItems().addAll(add, new SeparatorMenuItem(), exit);//Menu菜单类型对象添加MenuItem类型选项对象 // --- Menu Edit Menu menuEdit = new Menu("菜单二");//菜单对象的建立 menuEdit.getItems().add(clear);//给菜单二对象上添加MenuItem对象clear // --- Menu View Menu menuView = new Menu("菜单三");//创建菜单对象菜单三 //在start方法中创建四个Check Menu Item CheckMenuItem titleView = createMenuItem("标题区域", name); CheckMenuItem binNameView = createMenuItem("名称区域", binName); CheckMenuItem picView = createMenuItem("图片区域", pic); CheckMenuItem descriptionView = createMenuItem("描述区域", description); menuView.getItems().addAll(titleView, binNameView, picView, descriptionView);//Menu菜单三中添加相关CheckMenuItem类型菜单选项 menuBar.getMenus().addAll(menuFile, menuEdit, menuView);//将上述定义的Menu对象镶嵌进MenuBar类型对象中 ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);//scene对象的根节点元素上添加上文定义的menuBar对象和vbox对象 stage.setScene(scene);//舞台设置场景 stage.show();//舞台展现 } private void shuffle() {//洗牌程序(清晰复原程序) int i = currentIndex; while (i == currentIndex) { i = (int) (Math.random() * pages.length); } pic.setImage(pages[i].image);//图片视图区域价值图片 name.setText(pages[i].name);//label添加文字 binName.setText("(" + pages[i].binNames + ")");//label添加文字 description.setText(pages[i].description);//label对象添加文字 currentIndex = i; } private class PageData {//类似于pojo这么个domain型业务领域对象 public String name; public String description; public String binNames; public Image image; public PageData(String name, String description, String binNames) { this.name = name; this.description = description; this.binNames = binNames; image = new Image(getClass().getResourceAsStream("department.png")); } } //createMenuItem方法 private static CheckMenuItem createMenuItem(String title, final Node node) { CheckMenuItem cmi = new CheckMenuItem(title);//创建一个CheckMenuItem类型菜单选项 cmi.setSelected(true);//设置这个CheckMenuItem类型菜单选项被选中了 cmi.selectedProperty().addListener(//给CheckMenuItem类型菜单选项添加更新选中事件匿名事件处理监听器对象 (ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) -> {//事件监听回调函数体 node.setVisible(new_val);//设置传进来的node节点对象的可见性为本CheckMenuItem类型菜单选项的选中状态值决定 }); return cmi; } }
javaFX学习之 在Menu菜单中 使用CheckMenuItem类来创建开关选项
于 2022-02-10 13:48:36 首次发布